Browse Source

Merge branch 'master' of https://github.com/n0shake/Clocker

pull/92/head
Abhishek 4 years ago
parent
commit
6a048405b7
  1. 7
      Clocker/AppDelegate.swift
  2. 23
      Clocker/Clocker.xcodeproj/project.pbxproj
  3. 5
      Clocker/Clocker.xcodeproj/xcshareddata/xcschemes/Clocker.xcscheme
  4. 2
      Clocker/Clocker.xcodeproj/xcuserdata/ban.xcuserdatad/xcschemes/xcschememanagement.plist
  5. 2
      Clocker/Clocker/LocationController.swift
  6. 3
      Clocker/Clocker/ca.lproj/Localizable.strings
  7. 453
      Clocker/Clocker/de.lproj/Localizable.strings
  8. 4
      Clocker/Clocker/en.lproj/Localizable.strings
  9. 47
      Clocker/Clocker/en.lproj/Panel.xib
  10. 3
      Clocker/Clocker/es.lproj/Localizable.strings
  11. 3
      Clocker/Clocker/fr.lproj/Localizable.strings
  12. 3
      Clocker/Clocker/hi.lproj/Localizable.strings
  13. 3
      Clocker/Clocker/it.lproj/Localizable.strings
  14. 2
      Clocker/Clocker/ja.lproj/Localizable.strings
  15. 129
      Clocker/Clocker/ko.lproj/Localizable.strings
  16. 3
      Clocker/Clocker/nl.lproj/Localizable.strings
  17. 162
      Clocker/Clocker/pt-BR.lproj/Localizable.strings
  18. 3
      Clocker/Clocker/ru.lproj/Localizable.strings
  19. 471
      Clocker/Clocker/zh-Hans.lproj/Localizable.strings
  20. 1
      Clocker/ClockerUITests/AboutUsTests.swift
  21. 6
      Clocker/ClockerUITests/FloatingWindowTests.swift
  22. 14
      Clocker/ClockerUITests/OnboardingTests.swift
  23. 4
      Clocker/ClockerUITests/PreferencesTest.swift
  24. 2
      Clocker/Dependencies/Date Additions/TimeChunk.swift
  25. 8
      Clocker/Dependencies/Date Additions/TimePeriod.swift
  26. 2
      Clocker/Dependencies/Date Additions/TimePeriodChain.swift
  27. 14
      Clocker/Events and Reminders/CalendarHandler.swift
  28. 2
      Clocker/Events and Reminders/EventCenter.swift
  29. 2
      Clocker/Media.xcassets/Onboarding/Dark Menubar.imageset/Contents.json
  30. BIN
      Clocker/Media.xcassets/Onboarding/Dark Menubar.imageset/Screen Shot 2020-10-11 at 2.16.37 PM.png
  31. BIN
      Clocker/Media.xcassets/Onboarding/Dark Menubar.imageset/Screen Shot 2020-10-11 at 2.19.26 PM.png
  32. 2
      Clocker/Menu Bar/MenubarHandler.swift
  33. 2
      Clocker/Menu Bar/StatusContainerView.swift
  34. 16
      Clocker/Menu Bar/StatusItemHandler.swift
  35. 2
      Clocker/Onboarding/FinalOnboardingViewController.swift
  36. 78
      Clocker/Onboarding/Onboarding.storyboard
  37. 11
      Clocker/Onboarding/OnboardingParentViewController.swift
  38. 12
      Clocker/Onboarding/OnboardingSearchController.swift
  39. 16
      Clocker/Overall App/AppDefaults.swift
  40. 3
      Clocker/Overall App/DataStore.swift
  41. 12
      Clocker/Overall App/Logger.swift
  42. 2
      Clocker/Overall App/Strings.swift
  43. 31
      Clocker/Overall App/Themer.swift
  44. 8
      Clocker/Overall App/VersionUpdateHandler.swift
  45. 2
      Clocker/Panel/Data Layer/TimezoneData.swift
  46. 35
      Clocker/Panel/Data Layer/TimezoneDataOperations.swift
  47. 4
      Clocker/Panel/Notes Popover/NotesPopover.swift
  48. 4
      Clocker/Panel/PanelController.swift
  49. 33
      Clocker/Panel/ParentPanelController.swift
  50. 31
      Clocker/Panel/UI/HourMarkerViewItem.swift
  51. 4
      Clocker/Panel/UI/HourMarkerViewItem.xib
  52. 2
      Clocker/Panel/UI/PanelTableView.swift
  53. 14
      Clocker/Panel/UI/TimezoneDataSource.swift
  54. 18
      Clocker/Preferences/Appearance/AppearanceViewController.swift
  55. 2
      Clocker/Preferences/Calendar/CalendarViewController.swift
  56. 2
      Clocker/Preferences/General/PreferencesDataSource.swift
  57. 18
      Clocker/Preferences/General/PreferencesViewController.swift
  58. 96
      Clocker/Preferences/Preferences.storyboard

7
Clocker/AppDelegate.swift

@ -164,12 +164,7 @@ open class AppDelegate: NSObject, NSApplicationDelegate {
let defaults = UserDefaults.standard let defaults = UserDefaults.standard
let currentActivationPolicy = NSRunningApplication.current.activationPolicy let currentActivationPolicy = NSRunningApplication.current.activationPolicy
var activationPolicy: NSApplication.ActivationPolicy = defaults.integer(forKey: CLAppDisplayOptions) == 0 ? .accessory : .regular let activationPolicy: NSApplication.ActivationPolicy = defaults.integer(forKey: CLAppDisplayOptions) == 0 ? .accessory : .regular
#if DEBUG
UserDefaults.standard.set(1, forKey: CLAppDisplayOptions)
activationPolicy = .regular
#endif
if currentActivationPolicy != activationPolicy { if currentActivationPolicy != activationPolicy {
NSApp.setActivationPolicy(activationPolicy) NSApp.setActivationPolicy(activationPolicy)

23
Clocker/Clocker.xcodeproj/project.pbxproj

@ -84,7 +84,6 @@
35C36FA22259ED6D002FA5C6 /* RemindersHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35C36F9F2259ED6D002FA5C6 /* RemindersHandler.swift */; }; 35C36FA22259ED6D002FA5C6 /* RemindersHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35C36F9F2259ED6D002FA5C6 /* RemindersHandler.swift */; };
35C36FA42259EEC2002FA5C6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35C36FA32259EEC2002FA5C6 /* AppDelegate.swift */; }; 35C36FA42259EEC2002FA5C6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35C36FA32259EEC2002FA5C6 /* AppDelegate.swift */; };
35EB537325310FD200311068 /* TimezoneDataEqualityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3545C52A22612BCC00121E25 /* TimezoneDataEqualityTests.swift */; }; 35EB537325310FD200311068 /* TimezoneDataEqualityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3545C52A22612BCC00121E25 /* TimezoneDataEqualityTests.swift */; };
35F14BDE25073E4C0052B240 /* Keys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 35F14BDD25073E4C0052B240 /* Keys.plist */; };
9A0A1C8C20903DBD0012003B /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A9E87651C1FEDC500A7A2DF /* CoreLocation.framework */; }; 9A0A1C8C20903DBD0012003B /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A9E87651C1FEDC500A7A2DF /* CoreLocation.framework */; };
9A13BAD61CA87F08007C6CBE /* Panel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9A13BAD81CA87F08007C6CBE /* Panel.xib */; }; 9A13BAD61CA87F08007C6CBE /* Panel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9A13BAD81CA87F08007C6CBE /* Panel.xib */; };
9A13BAE01CA882FA007C6CBE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9A13BAE21CA882FA007C6CBE /* InfoPlist.strings */; }; 9A13BAE01CA882FA007C6CBE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9A13BAE21CA882FA007C6CBE /* InfoPlist.strings */; };
@ -92,6 +91,7 @@
9A20A04B1C4DEED200FB45AB /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A20A04A1C4DEED200FB45AB /* IOKit.framework */; }; 9A20A04B1C4DEED200FB45AB /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A20A04A1C4DEED200FB45AB /* IOKit.framework */; };
9A24A1881ED902CC0095201E /* EventKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A24A1871ED902CC0095201E /* EventKit.framework */; }; 9A24A1881ED902CC0095201E /* EventKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A24A1871ED902CC0095201E /* EventKit.framework */; };
9A3169C11D2CC5AA0079FDF8 /* com.abhishek.ClockerHelper.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9A3169C01D2CC5AA0079FDF8 /* com.abhishek.ClockerHelper.plist */; }; 9A3169C11D2CC5AA0079FDF8 /* com.abhishek.ClockerHelper.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9A3169C01D2CC5AA0079FDF8 /* com.abhishek.ClockerHelper.plist */; };
9A348B312545DE18000E846F /* Keys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9A348B302545DE17000E846F /* Keys.plist */; };
9A4379271BEC223900F4E27F /* Fabric.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A4379231BEC223900F4E27F /* Fabric.framework */; }; 9A4379271BEC223900F4E27F /* Fabric.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A4379231BEC223900F4E27F /* Fabric.framework */; };
9A43792A1BEC230A00F4E27F /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A4379291BEC230A00F4E27F /* libc++.tbd */; }; 9A43792A1BEC230A00F4E27F /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A4379291BEC230A00F4E27F /* libc++.tbd */; };
9A56DB801C1CFB73004CE6AF /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9A56DB7D1C1CFB73004CE6AF /* MainMenu.xib */; }; 9A56DB801C1CFB73004CE6AF /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9A56DB7D1C1CFB73004CE6AF /* MainMenu.xib */; };
@ -228,6 +228,7 @@
352AF497232E07B400D96FA7 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 352AF497232E07B400D96FA7 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/InfoPlist.strings; sourceTree = "<group>"; };
352AF499232E07B400D96FA7 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = "<group>"; }; 352AF499232E07B400D96FA7 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = "<group>"; };
3545C52A22612BCC00121E25 /* TimezoneDataEqualityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimezoneDataEqualityTests.swift; sourceTree = "<group>"; }; 3545C52A22612BCC00121E25 /* TimezoneDataEqualityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimezoneDataEqualityTests.swift; sourceTree = "<group>"; };
3569A44E25441F320087E254 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; };
357391852507277500D30819 /* HourMarkerViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HourMarkerViewItem.swift; sourceTree = "<group>"; }; 357391852507277500D30819 /* HourMarkerViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HourMarkerViewItem.swift; sourceTree = "<group>"; };
357391862507277500D30819 /* HourMarkerViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HourMarkerViewItem.xib; sourceTree = "<group>"; }; 357391862507277500D30819 /* HourMarkerViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HourMarkerViewItem.xib; sourceTree = "<group>"; };
3595FACF227F88BC0044A12A /* UserDefaults + KVOExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults + KVOExtensions.swift"; sourceTree = "<group>"; }; 3595FACF227F88BC0044A12A /* UserDefaults + KVOExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults + KVOExtensions.swift"; sourceTree = "<group>"; };
@ -305,7 +306,6 @@
35C36F9E2259ED6D002FA5C6 /* EventCenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventCenter.swift; sourceTree = "<group>"; }; 35C36F9E2259ED6D002FA5C6 /* EventCenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventCenter.swift; sourceTree = "<group>"; };
35C36F9F2259ED6D002FA5C6 /* RemindersHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemindersHandler.swift; sourceTree = "<group>"; }; 35C36F9F2259ED6D002FA5C6 /* RemindersHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemindersHandler.swift; sourceTree = "<group>"; };
35C36FA32259EEC2002FA5C6 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = SOURCE_ROOT; }; 35C36FA32259EEC2002FA5C6 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = SOURCE_ROOT; };
35F14BDD25073E4C0052B240 /* Keys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Keys.plist; path = ../Internal/Keys.plist; sourceTree = "<group>"; };
9A13BAD71CA87F08007C6CBE /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/Panel.xib; sourceTree = "<group>"; }; 9A13BAD71CA87F08007C6CBE /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/Panel.xib; sourceTree = "<group>"; };
9A13BAE11CA882FA007C6CBE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 9A13BAE11CA882FA007C6CBE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
9A13BAEB1CA88A76007C6CBE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; }; 9A13BAEB1CA88A76007C6CBE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
@ -313,6 +313,7 @@
9A20A06F1C4E804D00FB45AB /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; }; 9A20A06F1C4E804D00FB45AB /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; };
9A24A1871ED902CC0095201E /* EventKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = EventKit.framework; path = System/Library/Frameworks/EventKit.framework; sourceTree = SDKROOT; }; 9A24A1871ED902CC0095201E /* EventKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = EventKit.framework; path = System/Library/Frameworks/EventKit.framework; sourceTree = SDKROOT; };
9A3169C01D2CC5AA0079FDF8 /* com.abhishek.ClockerHelper.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = com.abhishek.ClockerHelper.plist; path = Clocker/com.abhishek.ClockerHelper.plist; sourceTree = "<group>"; }; 9A3169C01D2CC5AA0079FDF8 /* com.abhishek.ClockerHelper.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = com.abhishek.ClockerHelper.plist; path = Clocker/com.abhishek.ClockerHelper.plist; sourceTree = "<group>"; };
9A348B302545DE17000E846F /* Keys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Keys.plist; path = Internal/Keys.plist; sourceTree = "<group>"; };
9A4379231BEC223900F4E27F /* Fabric.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Fabric.framework; sourceTree = "<group>"; }; 9A4379231BEC223900F4E27F /* Fabric.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Fabric.framework; sourceTree = "<group>"; };
9A4379291BEC230A00F4E27F /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; 9A4379291BEC230A00F4E27F /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
9A43792B1BEC231100F4E27F /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; 9A43792B1BEC231100F4E27F /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
@ -828,7 +829,7 @@
DD4F7BF913C30F9F00825C6E = { DD4F7BF913C30F9F00825C6E = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
35F14BDD25073E4C0052B240 /* Keys.plist */, 9A348B302545DE17000E846F /* Keys.plist */,
35C36F9B2259EC97002FA5C6 /* Events and Reminders */, 35C36F9B2259EC97002FA5C6 /* Events and Reminders */,
35C36F382259D80C002FA5C6 /* Overall App */, 35C36F382259D80C002FA5C6 /* Overall App */,
35C36F242259D64D002FA5C6 /* Panel */, 35C36F242259D64D002FA5C6 /* Panel */,
@ -1038,6 +1039,7 @@
it, it,
tr, tr,
ar, ar,
"pt-BR",
); );
mainGroup = DD4F7BF913C30F9F00825C6E; mainGroup = DD4F7BF913C30F9F00825C6E;
productRefGroup = DD4F7C0513C30F9F00825C6E /* Products */; productRefGroup = DD4F7C0513C30F9F00825C6E /* Products */;
@ -1113,7 +1115,7 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
35F14BDE25073E4C0052B240 /* Keys.plist in Resources */, 9A348B312545DE18000E846F /* Keys.plist in Resources */,
9A13BAEA1CA88A76007C6CBE /* Localizable.strings in Resources */, 9A13BAEA1CA88A76007C6CBE /* Localizable.strings in Resources */,
357391882507277500D30819 /* HourMarkerViewItem.xib in Resources */, 357391882507277500D30819 /* HourMarkerViewItem.xib in Resources */,
9AB6F15E2259D08300A44663 /* iVersion.bundle in Resources */, 9AB6F15E2259D08300A44663 /* iVersion.bundle in Resources */,
@ -1362,6 +1364,7 @@
9AA522D123416A0E00C9E005 /* es */, 9AA522D123416A0E00C9E005 /* es */,
9AA522D523416A6000C9E005 /* nl */, 9AA522D523416A6000C9E005 /* nl */,
9AA522D723416E6000C9E005 /* it */, 9AA522D723416E6000C9E005 /* it */,
3569A44E25441F320087E254 /* pt-BR */,
); );
name = Localizable.strings; name = Localizable.strings;
path = Clocker; path = Clocker;
@ -1466,7 +1469,7 @@
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 81; CURRENT_PROJECT_VERSION = 83;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
@ -1491,7 +1494,7 @@
INFOPLIST_FILE = "Clocker/Clocker-Info.plist"; INFOPLIST_FILE = "Clocker/Clocker-Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.12; MACOSX_DEPLOYMENT_TARGET = 10.12;
MARKETING_VERSION = 20.10.01; MARKETING_VERSION = 20.10.02;
OTHER_LDFLAGS = ""; OTHER_LDFLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = com.abhishek.Clocker; PRODUCT_BUNDLE_IDENTIFIER = com.abhishek.Clocker;
PRODUCT_NAME = Clocker; PRODUCT_NAME = Clocker;
@ -1953,7 +1956,7 @@
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 81; CURRENT_PROJECT_VERSION = 83;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
@ -1980,7 +1983,7 @@
INFOPLIST_FILE = "Clocker/Clocker-Info.plist"; INFOPLIST_FILE = "Clocker/Clocker-Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.12; MACOSX_DEPLOYMENT_TARGET = 10.12;
MARKETING_VERSION = 20.10.01; MARKETING_VERSION = 20.10.02;
ONLY_ACTIVE_ARCH = NO; ONLY_ACTIVE_ARCH = NO;
OTHER_LDFLAGS = ""; OTHER_LDFLAGS = "";
"OTHER_SWIFT_FLAGS[arch=*]" = "-D DEBUG"; "OTHER_SWIFT_FLAGS[arch=*]" = "-D DEBUG";
@ -2018,7 +2021,7 @@
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 81; CURRENT_PROJECT_VERSION = 83;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
@ -2043,7 +2046,7 @@
INFOPLIST_FILE = "Clocker/Clocker-Info.plist"; INFOPLIST_FILE = "Clocker/Clocker-Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.12; MACOSX_DEPLOYMENT_TARGET = 10.12;
MARKETING_VERSION = 20.10.01; MARKETING_VERSION = 20.10.02;
OTHER_LDFLAGS = ""; OTHER_LDFLAGS = "";
"OTHER_SWIFT_FLAGS[arch=*]" = "-D RELEASE"; "OTHER_SWIFT_FLAGS[arch=*]" = "-D RELEASE";
PRODUCT_BUNDLE_IDENTIFIER = com.abhishek.Clocker; PRODUCT_BUNDLE_IDENTIFIER = com.abhishek.Clocker;

5
Clocker/Clocker.xcodeproj/xcshareddata/xcschemes/Clocker.xcscheme

@ -82,11 +82,6 @@
</BuildableReference> </BuildableReference>
</BuildableProductRunnable> </BuildableProductRunnable>
<EnvironmentVariables> <EnvironmentVariables>
<EnvironmentVariable
key = "OS_ACTIVITY_MODE"
value = "disable"
isEnabled = "YES">
</EnvironmentVariable>
<EnvironmentVariable <EnvironmentVariable
key = "ENABLE_PERF_LOGGING" key = "ENABLE_PERF_LOGGING"
value = "NO" value = "NO"

2
Clocker/Clocker.xcodeproj/xcuserdata/ban.xcuserdatad/xcschemes/xcschememanagement.plist

@ -17,7 +17,7 @@
<key>Tests.xcscheme_^#shared#^_</key> <key>Tests.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>1</integer> <integer>2</integer>
</dict> </dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key> <key>SuppressBuildableAutocreation</key>

2
Clocker/Clocker/LocationController.swift

@ -111,6 +111,6 @@ extension LocationController: CLLocationManagerDelegate {
} }
func locationManager(_: CLLocationManager, didFailWithError error: Error) { func locationManager(_: CLLocationManager, didFailWithError error: Error) {
print(error) Logger.info(error.localizedDescription)
} }
} }

3
Clocker/Clocker/ca.lproj/Localizable.strings

@ -156,3 +156,6 @@
"New Zealand" = "New Zealand"; "New Zealand" = "New Zealand";
"Florida" = "Florida"; "Florida" = "Florida";
"San Francisco" = "San Francisco"; "San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

453
Clocker/Clocker/de.lproj/Localizable.strings

@ -1,332 +1,161 @@
/* (No Comment) */ /*
"About Tab" = "Über Clocker"; Localizable.strings
Clocker
"CFBundleDisplayName" = "Clocker"; Created by Abhishek Banthia on 3/27/16.
/* Button to add a location */ */
"Add Button Title" = "Hinzufügen";
/* (No Comment) */ "CFBundleDisplayName" = "Clocker";
"Thank you for helping make Clocker even better!" = "Danke, dass du dabei geholfen hast, Clocker noch besser zu machen!";
"iRateMessageTitle" = "%@ bewerten";
"iRateAppMessage" = "Wenn dir %@ gefällt, dann bewerte uns doch im App Store. Das dauert kaum eine Minute und hilft uns sehr. Vielen Dank für deine Unterstützung!";
"iRateGameMessage" = "Wenn du Spaß an %@ hast, dann bewerte uns doch im App Store. Das dauert kaum eine Minute und hilft uns sehr. Vielen Dank, für deine Unterstützung!";
"iRateCancelButton" = "Nein, danke";
"iRateRateButton" = "Jetzt bewerten";
"iRateRemindButton" = "Später erinnern";
"iRateUpdateMessage" = "Jetzt aktualisieren?";
"ClockerVersion" = "Version %@";
"CLFeedbackAlertTitle" = "Danke, dass Du hilfst Clocker noch besser zu machen!";
"app-name" = "Clocker"; "app-name" = "Clocker";
"start-at-login" = "Bei der Anmeldung starten";
/* (No Comment) */ "setup-steps" = "In nur drei Schritten ist Clocker fertig eingerichtet";
"Appearance Tab" = "Darstellungen"; "Permissions-Header" = "Berechtigungen";
"See your next Calendar event here." = "Hier Deinen nächsten Kalendereintrag anzeigen.";
/* Button title for going back to the previous screen */ "Click here to start." = "Hier klicken, um zu starten.";
"Back" = "Zurück"; "Reminders Access" = "Erinnerungen-Zugriff";
/* Calendar Permission Title */
"Calendar Access" = "Kalender-Zugriff"; "Calendar Access" = "Kalender-Zugriff";
"Permissions" = "Berechtigungen";
/* Title for Calendar access label */ "Calendar Detail" = "Anstehende Termine aus Deinem persönlichen und geteilten Kalendern können in der Menüleiste und im Fenster angezeigt werden.";
"Calendar Access Title" = "Kalender-Zugriff"; "Reminders Detail" = "Erinnerungen in der Zeitzone Deiner Wahl festlegen. Deine Erinnerungen werden in der Standard-Erinnerungs-App gespeichert.";
"Privacy Text" = "Du kannst das später im Bereich Datenschutz in den Systemeinstellungen ändern.";
/* Calendar Detail Text */ "Granted Button Text" = "Gewährt";
"Calendar Detail" = "Die nächsten Termine Ihrer persönlichen und geteilten Kalender können in der Menüleiste und im Panel angezeigt werden."; "Denied Button Text" = "Verweigert";
"Grant Button Text" = "Gewähren";
/* (No Comment) */
// Welcome Onboarding
"It only takes 3 steps to setup Clocker." = "In nur drei Schritten ist Clocker fertig eingerichtet.";
"Get Started" = "Erste Schritte";
// Tab Item Titles
"Preferences Tab" = "Einstellungen";
"Appearance Tab" = "Darstellung";
"Calendar Tab" = "Kalender"; "Calendar Tab" = "Kalender";
"About Tab" = "Über";
/* (No Comment) */ "Permissions Tab" = "Berechtigungen";
"characters" = "characters";
// General Preferences Screen
/* (No Comment) */ "Start at Login" = "Clocker bei der Anmeldung starten";
"CLFeedbackAlertTitle" = "Vielen Dank, dass Sie Clocker noch besser machen!"; "Sort by Time Difference" = "Nach Zeitdifferenz sortieren";
"Sort by Name" = "Nach Namen sortieren";
/* Button Title for no Calendar access */ "Sort by Label" = "Nach Bezeichnung sortieren";
"Click here to start." = "Klicken Sie hier, um zu starten."; "Search Field Placeholder" = "Gebe eine Stadt, ein Bundesland oder Land ein";
"No Timezone Selected" = "Bitte wählen Sie eine Zeitzone!";
/* (No Comment) */ "Max Timezones Selected" = "Es werden maximal 100 Zeitzonen unterstützt!";
"Clocker is more useful when it can display events from your calendars." = "Clocker ist nützlicher, wenn es Ereignisse von Ihren Kalender anzeigen kann."; "Max Search Characters" = "Es sind nur 50 Zeichen erlaubt!";
"Add Button Title" = "Hinzufügen";
/* (No Comment) */
"Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy." = "Clocker ist nützlicher, wenn es Ereignisse von Ihren Kalender anzeigen kann. Sie können diese Einstellung in Systemeinstellungen › Sicherheit und Privatsphäre › Privatsphäre ändern.";
/* (No Comment) */
"ClockerVersion" = "Version %@";
/* Button to close the panel */
"Close Button Title" = "Schließen"; "Close Button Title" = "Schließen";
/* (No Comment) */ // Onboarding
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "Kontaktfelder sind optional! Ihre Kontaktinformationen läßt uns Sie kontaktieren, falls wir weitere Informationen benötigen oder helfen können!"; "Open Clocker At Login" = "Clocker bei der Anmeldung starten";
"Launch Clocker" = "Clocker starten";
/* (No Comment) */ // Welcome Onboarding
"Contact Information (Optional)" = "Kontaktinformationen (optional)"; "It only takes 3 steps to set up Clocker." = "In nur drei Schritten ist Clocker fertig eingerichtet.";
"Get Started" = "Erste Schritte";
/* Continue Button Title */ // Permissions
"Calendar Access Title" = "Kalender-Zugriff";
"Reminders Access Title" = "Zugriff auf Erinnerungen";
"Later Config Description" = "Dies kann später in den Clocker Einstellungen konfiguriert werden.";
"Back" = "Zurück";
"Continue" = "Fortfahren"; "Continue" = "Fortfahren";
"Clocker is more useful when it can display events from your calendars." = "Clocker ist nützlicher, wenn es Ereignisse aus Deinem Kalendern anzeigen kann.";
/* (No Comment) */ "Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy." = "Clocker ist nützlicher, wenn es Ereignisse aus Deinem Kalendern anzeigen kann. Du kannst diese Einstellung in Systemeinstellungen › Sicherheit Privatsphäre › Privatsphäre ändern.";
"Day Display Options" = "Tagesanzeige Optionen"; "Launch Preferences" = "Einstellungen öffnen";
"Grant Access" = "Zugriff erlauben";
/* (No Comment) */ "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Anstehende Termine aus Deinem persönlichen und geteilten Kalendern können in der Menüleiste und im Fenster angezeigt werden.";
"Granted" = "Gewährt";
"Denied" = "Abgelehnt"; "Denied" = "Abgelehnt";
/* Denied Button Text */
"Denied Button Text" = "Abgelehnt";
/* (No Comment) */
"Display the time in seconds" = "Zeit in Sekunden anzeigen";
/* Title asking users if they like the app */
"Enjoy using Clocker" = "Gefällt Ihnen Clocker";
/* Review */
"Enjoy using Clocker?" = "Gefällt Ihnen Clocker?";
/* (No Comment) */
"Favourite a timezone to enable menubar display options." = "Favorisieren Sie eine Zeitzone, um die Menüleiste-Anzeigeoptionen zu aktivieren.";
/* About View Screen */
"Feedback is always welcome:" = "Feedback ist immer willkommen:";
/* (No Comment) */
"Florida" = "Florida";
/* (No Comment) */
"Future Slider Range" = "Zukünftige Slider-Bereich";
/* Title for Welcome View Controller's Continue Button */
"Get Started" = "Jetzt Anfangen";
/* (No Comment) */
"Grant" = "Gewähren"; "Grant" = "Gewähren";
"Unexpected" = "Unerwartet";
/* (No Comment) */ // Onboarding Search
"Grant Access" = "Zugriff gewähren"; "Quick Add Locations" = "Orte schnell hinzufügen";
"More search options in Clocker Preferences." = "Weitere Suchoptionen in den Clocker Einstellungen.";
/* Grant Button Text */ "Enter 3 or more characters for locations you'll like to add" = "Gebe 3 oder mehr Zeichen für den Orte ein, die Du hinzufügen möchtest";
"Grant Button Text" = "Zulassen";
// Start at Login
/* (No Comment) */ "Launch at Login" = "Bei der Anmelden starten";
"Granted" = "Zugelassen"; "This can be configured later in Clocker Preferences." = "Dies kann später in den Clocker Einstellungen konfiguriert werden.";
"Should Clocker open automatically on startup?" = "Soll Clocker beim Start automatisch geöffnet werden?";
/* Granted Button Text */
"Granted Button Text" = "Zugelassen"; // Final Onboarding Screen
"You're all set!" = "Du bist startklar!";
/* (No Comment) */ "Thank you for the details." = "Vielen Dank für die Details.";
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "Wenn der Besprechung Titel \"Meeting with Neel\" ist und die Kurzlänge auf fünf gesetzt ist, erscheint der Text in der Menüleiste als \"Meeti...\""; "You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences." = "Du wirst ein Uhr-Symbol in Ihrer Menüleiste sehen, wenn Du die App startest. Wenn Du ein Dock-Symbol sehen möchtest, gehe in die Einstellungen.";
"If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!" = "Wenn Du uns helfen möchtest die App in Deine Sprache zu übersetzen oder von Zeit zu Zeit Informationen zur App erhalten möchtest, gibt bitte hier Deine E-Mail ein!";
/* (No Comment) */
"If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!" = "Wenn Sie uns helfen möchten, die App in Ihrer Sprache zu lokalisieren oder seltene app-bezogene Nachrichten erhalten wollen, geben Sie bitte Ihre E-Mail ein!"; // Appearance Tab
"Panel Theme" = "Erscheinungsbild";
/* (No Comment) */ "Favourite a timezone to enable menubar display options." = "Favorisiere eine Zeitzone, um diese in der Menüleiste zu zeigen.";
"Include Date" = "Datum Anzeigen"; "Main Panel Options" = "Optionen für Programmfenster";
"Time Format" = "Zeitformat";
/* (No Comment) */ "Day Display Options" = "Anzeigeoptionen für den Tag";
"Include Day" = "Tag Anzeigen"; "Show Future Slider" = "\"Future Slider\" anzeigen";
"Show Sunrise/Sunset" = "Sonnenaufgang/-untergang anzeigen";
/* (No Comment) */ "Display the time in seconds" = "Zeit in Sekunden anzeigen";
"Include Place Name" = "Ortsname Anzeigen";
/* (No Comment) */
"iRateAppMessage" = "If you enjoy using %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
/* (No Comment) */
"iRateCancelButton" = "No, Thanks";
/* (No Comment) */
"iRateGameMessage" = "If you enjoy playing %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
/* (No Comment) */
"iRateMessageTitle" = "Rate %@";
/* (No Comment) */
"iRateRateButton" = "Rate It Now";
/* (No Comment) */
"iRateRemindButton" = "Remind Me Later";
/* (No Comment) */
"iRateUpdateMessage" = "Update now?";
/* App Setup Description */
"It only takes 3 steps to set up Clocker." = "Es sind nur 3 Schritte Clocker einzurichten.";
/* Welcome Onboarding */
"It only takes 3 steps to setup Clocker." = "Es sind nur 3 Schritte Clocker einzurichten.";
/* (No Comment) */
"Larger Text" = "Größerer Text"; "Larger Text" = "Größerer Text";
"Future Slider Range" = "Bereich für den \"Future Slider\"";
"Include Date" = "Datum hinzufügen";
"Include Day" = "Tag hinzufügen";
"Include Place Name" = "Ortsname hinzufügen";
"Menubar Display Options" = "Anzeigeoptionen für die Menüleiste";
"Menubar Mode" = "Menüleisten-Modus";
"Preview" = "Vorschau";
"Miscellaneous" = "Verschiedenes";
// Empty View
"No places added" = "Keine Orte hinzugefügt";
// Panel
"No upcoming event." = "Kein anstehendes Ereignis.";
"You have no events scheduled for tomorrow." = "Du hast keine Kalendereinträge für morgen.";
// Review
"Enjoy using Clocker?" = "Gefällt Dir Clocker?";
// App Feedback
"Tell us what you think!" = "Sag uns, was Du denkst!";
"Contact Information (Optional)" = "Kontaktinformationen (optional)";
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "Kontaktinformationen sind optional! Diese helfen uns jedoch Dich zu erreichen, falls wir weitere Informationen benötigen oder helfen können!";
/* Describing we can change the options later in System Preferences */ // About View Screen
"Later Config Description" = "Diese können später in Systemeinstellungen konfiguriert werden."; "Feedback is always welcome:" = "Feedback ist immer willkommen:";
/* Start at Login */
"Launch at Login" = "Launch at Login";
/* (No Comment) */
"Launch Clocker" = "Clocker Starten";
/* (No Comment) */
"Launch Preferences" = "Launch Preferences";
/* (No Comment) */
"Main Panel Options" = "Main Panel Options";
/* Max Character Count Allowed Error Message */
"Max Search Characters" = "Only 50 characters allowed!";
/* Max Timezones Error Message */
"Max Timezones Selected" = "Maximum 100 timezones allowed!";
/* (No Comment) */
"Menubar Display Options" = "Menubar Display Options";
/* (No Comment) */
"Menubar Mode" = "Menubar Mode";
/* (No Comment) */
"More search options in Clocker Preferences." = "More search options in Clocker Preferences.";
/* UI Tests */ // Calendars View
"Upcoming Event View Options" = "Zukünftige Ereignisse zeigen";
"Show Upcoming Event View" = "Anzeigeoptionen für zukünftige Ereignisse";
"Show All Day Meetings" = "Ganztägige Ereignisse anzeigen";
"Show Next Meeting Title in Menubar" = "Das nächste Ereignis in der Menüliste zeigen";
"Truncate menubar text longer than" = "Text in der Menüleiste kürzen, der länger ist als";
"characters" = "Zeichen";
"Show events from" = "Zeige Ereignisse aus";
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "Wenn der Besprechungstitel \"Besprechung mit Neel\" ist und die Kürzungslänge auf 5 eingestellt wurde, dann erscheint der Text in der Menüleiste als \"Bespr...\"";
// Notes Popover
"Reminder Set" = "Erinnerung gespeichert";
"Successfully set." = "Erfolgreich gespeichert.";
// Errors
"You're offline, maybe?" = "Bist Du eventuell offline?";
"Try again, maybe?" = "Versuche es nochmal!";
"The Internet connection appears to be offline." = "Scheinbar besteht keine Verbindung zum Internet.";
// UI Tests
"New Zealand" = "Neuseeland"; "New Zealand" = "Neuseeland";
"Florida" = "Florida";
/* Subtitle for no places added */
"No places added" = "No places added";
/* Message shown when the user taps on Add without selecting a timezone */
"No Timezone Selected" = "Please select a timezone!";
/* Title when there's no upcoming event */
"No upcoming event." = "No upcoming event.";
/* Onboarding */
"Open Clocker At Login" = "Open Clocker At Login";
/* Appearance Tab */
"Panel Theme" = "Panel Theme";
/* Permissions Tab Titles */
"Permissions" = "Permissions";
/* Title for Permissions screen */
"Permissions Tab" = "Permissions";
/* (No Comment) */
"Permissions-Header" = "Permissions";
/* Tab Item Titles */
"Preferences Tab" = "Preferences";
/* Text explaining options can be changed in the future through System Preferences */
"Privacy Text" = "You can change this later in the Privacy section of the System Preferences.";
/* Onboarding Search */
"Quick Add Locations" = "Quick Add Locations";
/* Notes Popover */
"Reminder Set" = "Reminder Set";
/* Reminders Permission Title */
"Reminders Access" = "Reminders Access";
/* Title for Reminders Access Label */
"Reminders Access Title" = "Reminders Access";
/* Reminders Detail Text */
"Reminders Detail" = "Set reminders in the timezone of the location of your choice. Your reminders are stored in the default Reminders app.";
/* (No Comment) */
"San Francisco" = "San Francisco"; "San Francisco" = "San Francisco";
/* Search Field Placeholder */ // DST changes
"Search Field Placeholder" = "Enter a city, state or country name"; "Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";
/* (No Comment) */
"Enter 3 or more characters for locations you'll like to add" = "Enter 3 or more characters for locations you'll like to add";
/* Next Event Label for no Calendar access */
"See your next Calendar event here." = "See your next Calendar event here.";
/* (No Comment) */
"setup-steps" = "It only takes 3 steps to set up Clocker";
/* (No Comment) */
"Should Clocker open automatically on startup?" = "Should Clocker open automatically on startup?";
/* (No Comment) */
"Show All Day Meetings" = "Show All Day Meetings";
/* (No Comment) */
"Show events from" = "Show events from";
/* (No Comment) */
"Show Future Slider" = "Show Future Slider";
/* (No Comment) */
"Show Next Meeting Title in Menubar" = "Show Next Meeting Title in Menubar";
/* (No Comment) */
"Show Sunrise/Sunset" = "Show Sunrise/Sunset";
/* (No Comment) */
"Show Upcoming Event View" = "Show Upcoming Event View";
/* Start at Login */
"Sort by Label" = "Sort by Label";
/* Start at Login */
"Sort by Name" = "Sort by Name";
/* Start at Login */
"Sort by Time Difference" = "Sort by Time Difference";
/* Start at Login */
"Start at Login" = "Start Clocker at Login";
/* (No Comment) */
"start-at-login" = "Start At Login";
/* (No Comment) */
"Successfully set." = "Successfully set.";
/* App Feedback */
"Tell us what you think!" = "Tell us what you think!";
/* (No Comment) */
"Thank you for helping make Clocker even better!" = "Thank you for helping make Clocker even better!";
/* (No Comment) */
"Thank you for the details." = "Thank you for the details.";
/* (No Comment) */
"The Internet connection appears to be offline." = "The Internet connection appears to be offline.";
/* (No Comment) */
"This can be configured later in Clocker Preferences." = "This can be configured later in Clocker Preferences.";
/* (No Comment) */
"Time Format" = "Time Format";
/* (No Comment) */
"Truncate menubar text longer than" = "Menüleisten Text kürzen länger als";
/* (No Comment) */
"Try again, maybe?" = "Vielleicht erneut versuchen?";
/* (No Comment) */
"Unexpected" = "Unerwartet";
/* Calendars View */
"Upcoming Event View Options" = "Kommende Ereignis Anzeige Optionen";
/* (No Comment) */
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
/* Title when there's no event scheduled for tomorrow */
"You have no events scheduled for tomorrow." = "You have no events scheduled for tomorrow.";
/* (No Comment) */
"You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences." = "You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences.";
/* Final Onboarding Screen */
"You're all set!" = "You're all set!";
/* Errors */
"You're offline, maybe?" = "You're offline, maybe?";
"Preview" = "Preview";
"Miscellaneous" = "Miscellaneous";

4
Clocker/Clocker/en.lproj/Localizable.strings

@ -156,3 +156,7 @@
"New Zealand" = "New Zealand"; "New Zealand" = "New Zealand";
"Florida" = "Florida"; "Florida" = "Florida";
"San Francisco" = "San Francisco"; "San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

47
Clocker/Clocker/en.lproj/Panel.xib

@ -16,6 +16,7 @@
<outlet property="leftButton" destination="WVY-D9-AAX" id="M2W-xG-chN"/> <outlet property="leftButton" destination="WVY-D9-AAX" id="M2W-xG-chN"/>
<outlet property="leftField" destination="8Qj-Y9-Okf" id="q3N-ht-jCd"/> <outlet property="leftField" destination="8Qj-Y9-Okf" id="q3N-ht-jCd"/>
<outlet property="mainTableView" destination="dFw-ts-8OZ" id="2kY-dd-rDV"/> <outlet property="mainTableView" destination="dFw-ts-8OZ" id="2kY-dd-rDV"/>
<outlet property="modernSlider" destination="lxA-64-3QU" id="kS5-ub-7gV"/>
<outlet property="nextEventLabel" destination="rld-Ag-KL1" id="GTY-j3-A1g"/> <outlet property="nextEventLabel" destination="rld-Ag-KL1" id="GTY-j3-A1g"/>
<outlet property="pinButton" destination="YXE-4J-5cn" id="k6V-HK-7XG"/> <outlet property="pinButton" destination="YXE-4J-5cn" id="k6V-HK-7XG"/>
<outlet property="preferencesButton" destination="Ctq-BV-GPN" id="cdL-5h-qmx"/> <outlet property="preferencesButton" destination="Ctq-BV-GPN" id="cdL-5h-qmx"/>
@ -41,7 +42,7 @@
<rect key="contentRect" x="1000" y="379" width="350" height="460"/> <rect key="contentRect" x="1000" y="379" width="350" height="460"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/> <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" focusRingType="none" misplaced="YES" id="6" customClass="BackgroundPanelView" customModule="Clocker" customModuleProvider="target"> <view key="contentView" focusRingType="none" misplaced="YES" id="6" customClass="BackgroundPanelView" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="379" height="460"/> <rect key="frame" x="0.0" y="0.0" width="350" height="460"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<stackView focusRingType="none" distribution="fill" orientation="vertical" alignment="leading" spacing="0.0" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="OZA-6o-SbE"> <stackView focusRingType="none" distribution="fill" orientation="vertical" alignment="leading" spacing="0.0" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="OZA-6o-SbE">
@ -534,6 +535,48 @@
<constraint firstItem="Ctq-BV-GPN" firstAttribute="leading" secondItem="B8X-sx-cjT" secondAttribute="leading" constant="8" id="ydm-oF-sVc"/> <constraint firstItem="Ctq-BV-GPN" firstAttribute="leading" secondItem="B8X-sx-cjT" secondAttribute="leading" constant="8" id="ydm-oF-sVc"/>
</constraints> </constraints>
</customView> </customView>
<customView hidden="YES" wantsLayer="YES" focusRingType="none" id="8W7-rS-Uob" userLabel="Slider View">
<rect key="frame" x="0.0" y="205" width="365" height="50"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<scrollView wantsLayer="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="htc-pO-AqH">
<rect key="frame" x="0.0" y="0.0" width="365" height="50"/>
<clipView key="contentView" id="N1e-zE-F86">
<rect key="frame" x="0.0" y="0.0" width="365" height="50"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<collectionView id="lxA-64-3QU">
<rect key="frame" x="0.0" y="0.0" width="365" height="158"/>
<autoresizingMask key="autoresizingMask" heightSizable="YES"/>
<collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" id="mgM-vQ-fB7">
<size key="itemSize" width="50" height="50"/>
</collectionViewFlowLayout>
<color key="primaryBackgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<connections>
<outlet property="dataSource" destination="-2" id="Exd-5i-4cB"/>
<outlet property="delegate" destination="-2" id="r49-5r-Rx5"/>
</connections>
</collectionView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="8II-oP-xbd">
<rect key="frame" x="1" y="33" width="363" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="f9b-8n-Bt1">
<rect key="frame" x="349" y="0.0" width="16" height="50"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews>
<constraints>
<constraint firstItem="htc-pO-AqH" firstAttribute="leading" secondItem="8W7-rS-Uob" secondAttribute="leading" id="0QY-hT-XLg"/>
<constraint firstAttribute="height" constant="50" id="5HT-Ps-YH3"/>
<constraint firstItem="htc-pO-AqH" firstAttribute="top" secondItem="8W7-rS-Uob" secondAttribute="top" id="Ag8-2G-tVA"/>
<constraint firstAttribute="bottom" secondItem="htc-pO-AqH" secondAttribute="bottom" id="YCJ-zB-dvc"/>
<constraint firstAttribute="trailing" secondItem="htc-pO-AqH" secondAttribute="trailing" id="d7f-wV-lqc"/>
</constraints>
</customView>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="B8X-sx-cjT" firstAttribute="leading" secondItem="OZA-6o-SbE" secondAttribute="leading" id="AUz-54-0mE"/> <constraint firstItem="B8X-sx-cjT" firstAttribute="leading" secondItem="OZA-6o-SbE" secondAttribute="leading" id="AUz-54-0mE"/>
@ -551,6 +594,7 @@
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities> </visibilityPriorities>
<customSpacing> <customSpacing>
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
@ -558,6 +602,7 @@
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing> </customSpacing>
</stackView> </stackView>
</subviews> </subviews>

3
Clocker/Clocker/es.lproj/Localizable.strings

@ -156,3 +156,6 @@
"New Zealand" = "New Zealand"; "New Zealand" = "New Zealand";
"Florida" = "Florida"; "Florida" = "Florida";
"San Francisco" = "San Francisco"; "San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

3
Clocker/Clocker/fr.lproj/Localizable.strings

@ -156,3 +156,6 @@
"New Zealand" = "New Zealand"; "New Zealand" = "New Zealand";
"Florida" = "Florida"; "Florida" = "Florida";
"San Francisco" = "San Francisco"; "San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

3
Clocker/Clocker/hi.lproj/Localizable.strings

@ -152,3 +152,6 @@
"New Zealand" = "नड"; "New Zealand" = "नड";
"Florida" = "फि"; "Florida" = "फि";
"San Francisco" = "सन फि"; "San Francisco" = "सन फि";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

3
Clocker/Clocker/it.lproj/Localizable.strings

@ -157,3 +157,6 @@
"New Zealand" = "New Zealand"; "New Zealand" = "New Zealand";
"Florida" = "Florida"; "Florida" = "Florida";
"San Francisco" = "San Francisco"; "San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

2
Clocker/Clocker/ja.lproj/Localizable.strings

@ -156,3 +156,5 @@
"Florida" = "Florida"; "Florida" = "Florida";
"San Francisco" = "San Francisco"; "San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

129
Clocker/Clocker/ko.lproj/Localizable.strings

@ -6,26 +6,27 @@
*/ */
"Thank you for helping make Clocker even better!" = "Thank you for helping make Clocker even better!"; "CFBundleDisplayName" = "시계";
"iRateMessageTitle" = "Rate %@"; "Thank you for helping make Clocker even better!" = "Clocker가 더 발전할 수 있도록 도와주셔서 정말 감사합니다!";
"iRateAppMessage" = "If you enjoy using %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!"; "iRateMessageTitle" = "비율 %@ ";
"iRateGameMessage" = "If you enjoy playing %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!"; "iRateAppMessage" = "%@을 즐기고 계신다면, 잠시 평가를 위해 시간을 내주시겠습니까? 단 1분도 걸리지 않겠습니다. 지원해주셔서 감사합니다!";
"iRateCancelButton" = "No, Thanks"; "iRateGameMessage" = "%@을 즐기고 계신다면, 잠시 평가를 위해 시간을 내주시겠습니까? 단 1분도 걸리지 않겠습니다. 지원해주셔서 감사합니다!";
"iRateRateButton" = "Rate It Now"; "iRateCancelButton" = "나중에 할게요";
"iRateRemindButton" = "Remind Me Later"; "iRateRateButton" = "지금 평가하기";
"iRateUpdateMessage" = "Update now?"; "iRateRemindButton" = "나중에 다시 알리기";
"ClockerVersion" = "Version %@"; "iRateUpdateMessage" = "지금 업데이트를 진행할까요?";
"CLFeedbackAlertTitle" = "Thank you for helping make Clocker even better!"; "ClockerVersion" = "버전 %@";
"app-name" = "Clocker"; "CLFeedbackAlertTitle" = "Clocker가 더 발전할 수 있도록 도와주셔서 정말 감사합니다!";
"start-at-login" = "Start At Login"; "app-name" = "시계";
"setup-steps" = "It only takes 3 steps to set up Clocker"; "start-at-login" = "로그인을 해주세요";
"Permissions-Header" = "Permissions"; "setup-steps" = "시계를 설정하는데 3가지만 하시면 됩니다";
"See your next Calendar event here." = "See your next Calendar event here."; "Permissions-Header" = "권한";
"Click here to start." = "Click here to start."; "See your next Calendar event here." = "당신의 다음 일정을 여기서 보세요";
"Reminders Access" = "Reminders Access"; "Click here to start." = "여기를 눌러서 시작합니다.";
"Calendar Access" = "Calendar Access"; "Reminders Access" = "리마인더 권한";
"Permissions" = "Permissions"; "Calendar Access" = "캘린더 권한";
"Calendar Detail" = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel."; "Permissions" = "권한";
"Calendar Detail" = "여러분의 개인&공유 캘린더에서 다가오는 이벤트들은 메뉴바와 패널에서 보여질 수 있습니다.";
"Reminders Detail" = "Set reminders in the timezone of the location of your choice. Your reminders are stored in the default Reminders app."; "Reminders Detail" = "Set reminders in the timezone of the location of your choice. Your reminders are stored in the default Reminders app.";
"Privacy Text" = "You can change this later in the Privacy section of the System Preferences."; "Privacy Text" = "You can change this later in the Privacy section of the System Preferences.";
"Granted Button Text" = "Granted"; "Granted Button Text" = "Granted";
@ -51,22 +52,22 @@
"Search Field Placeholder" = "Enter a city, state or country name"; "Search Field Placeholder" = "Enter a city, state or country name";
"No Timezone Selected" = "Please select a timezone!"; "No Timezone Selected" = "Please select a timezone!";
"Max Timezones Selected" = "Maximum 100 timezones allowed!"; "Max Timezones Selected" = "Maximum 100 timezones allowed!";
"Max Search Characters" = "Only 50 characters allowed!"; "Max Search Characters" = "50 문자까지만 허용됩니다!";
"Add Button Title" = "Add"; "Add Button Title" = "추가";
"Close Button Title" = "Close"; "Close Button Title" = "닫기";
// Onboarding // Onboarding
"Open Clocker At Login" = "Open Clocker At Login"; "Open Clocker At Login" = "로그인해서 Clocker 열기";
"Launch Clocker" = "Launch Clocker"; "Launch Clocker" = "Clocker 실행하기";
// Welcome Onboarding // Welcome Onboarding
"It only takes 3 steps to set up Clocker." = "It only takes 3 steps to setup Clocker."; "It only takes 3 steps to set up Clocker." = "It only takes 3 steps to setup Clocker.";
"Get Started" = "Get Started"; "Get Started" = "Get Started";
// Permissions // Permissions
"Calendar Access Title" = "Calendar Access"; "Calendar Access Title" = "캘린더 접근";
"Reminders Access Title" = "Reminders Access"; "Reminders Access Title" = "리마인더 권한";
"Later Config Description" = "These can be configured later in System Preferences."; "Later Config Description" = "이것들은 나중에 설정에서 바꾸실 수 있습니다";
"Back" = "Back"; "Back" = "Back";
"Continue" = "Continue"; "Continue" = "Continue";
"Clocker is more useful when it can display events from your calendars." = "Clocker is more useful when it can display events from your calendars."; "Clocker is more useful when it can display events from your calendars." = "Clocker is more useful when it can display events from your calendars.";
@ -104,54 +105,60 @@
"Show Future Slider" = "Show Future Slider"; "Show Future Slider" = "Show Future Slider";
"Show Sunrise/Sunset" = "Show Sunrise/Sunset"; "Show Sunrise/Sunset" = "Show Sunrise/Sunset";
"Display the time in seconds" = "Display the time in seconds"; "Display the time in seconds" = "Display the time in seconds";
"Larger Text" = "Larger Text"; "Larger Text" = "글씨를 크게하기";
"Future Slider Range" = "Future Slider Range"; "Future Slider Range" = "미래 슬라이더 범위";
"Include Date" = "Include Date"; "Include Date" = "날짜 추가하기";
"Include Day" = "Include Day"; "Include Day" = "시간 추가하기";
"Include Place Name" = "Include Place Name"; "Include Place Name" = "장소 이름";
"Menubar Display Options" = "Menubar Display Options"; "Menubar Display Options" = "메뉴바 화면표시 설정";
"Menubar Mode" = "Menubar Mode"; "Menubar Mode" = "메뉴바 모드";
"Preview" = "Preview"; "Preview" = "미리보기";
"Miscellaneous" = "Miscellaneous"; "Miscellaneous" = "기타";
// Empty View // Empty View
"No places added" = "No places added"; "No places added" = "추가된 장소가 없음";
// Panel // Panel
"No upcoming event." = "No upcoming event."; "No upcoming event." = "예정된 이벤트 없음";
"You have no events scheduled for tomorrow." = "You have no events scheduled for tomorrow."; "You have no events scheduled for tomorrow." = "내일 일정이 없어요!";
// Review // Review
"Enjoy using Clocker?" = "Enjoy using Clocker?"; "Enjoy using Clocker?" = "Clocker 사용에 만족하십니까?";
// App Feedback // App Feedback
"Tell us what you think!" = "Tell us what you think!"; "Tell us what you think!" = "여러분의 의견을 들려주세요.";
"Contact Information (Optional)" = "Contact Information (Optional)"; "Contact Information (Optional)" = "연락처 정보 (선택)";
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!"; "Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "연락처 필드는 선택 사항입니다! 귀하의 연락처 정보는 추가 정보가 필요하거나 도움이 필요한 경우 연락을 드릴 것입니다!";
// About View Screen // About View Screen
"Feedback is always welcome:" = "Feedback is always welcome:"; "Feedback is always welcome:" = "피드백은 언제나 환영입니다:";
// Calendars View // Calendars View
"Upcoming Event View Options" = "Upcoming Event View Options"; "Upcoming Event View Options" = "다가오는 이벤트 보기 옵션";
"Show Upcoming Event View" = "Show Upcoming Event View"; "Show Upcoming Event View" = "다가오는 일정 보기";
"Show All Day Meetings" = "Show All Day Meetings"; "Show All Day Meetings" = "모든 일정 보기";
"Show Next Meeting Title in Menubar" = "Show Next Meeting Title in Menubar"; "Show Next Meeting Title in Menubar" = "다음 일정을 메뉴바에서 보기";
"Truncate menubar text longer than" = "Truncate menubar text longer than"; "Truncate menubar text longer than" = "다음보다 긴 메뉴 표시 줄 텍스트를 자릅니다.
"characters" = "characters";
"Show events from" = "Show events from"; ";
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\""; "characters" = "글자";
"Show events from" = "오늘부터 이벤트 표시";
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "만약 미팅 제목이 \"Meeting with Neel\" 이면 5글자만 보여지기 때문에 주의해주세요. (\"Meeti...\")";
// Notes Popover // Notes Popover
"Reminder Set" = "Reminder Set"; "Reminder Set" = "알림 설정";
"Successfully set." = "Successfully set."; "Successfully set." = "설정이 완료되었습니다";
// Errors // Errors
"You're offline, maybe?" = "You're offline, maybe?"; "You're offline, maybe?" = "당신은 오프라인입니다. 아마도?";
"Try again, maybe?" = "Try again, maybe?"; "Try again, maybe?" = "다시 시도 해보세요";
"The Internet connection appears to be offline." = "The Internet connection appears to be offline."; "The Internet connection appears to be offline." = "인터넷 연결이 오프라인 상태입니다.";
// UI Tests // UI Tests
"New Zealand" = "New Zealand"; "New Zealand" = "뉴질랜드";
"Florida" = "Florida"; "Florida" = "플로리다";
"San Francisco" = "San Francisco"; "San Francisco" = "샌프란시스코";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

3
Clocker/Clocker/nl.lproj/Localizable.strings

@ -156,3 +156,6 @@
"New Zealand" = "New Zealand"; "New Zealand" = "New Zealand";
"Florida" = "Florida"; "Florida" = "Florida";
"San Francisco" = "San Francisco"; "San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

162
Clocker/Clocker/pt-BR.lproj/Localizable.strings

@ -0,0 +1,162 @@
/*
Localizable.strings
Clocker
Created by Abhishek Banthia on 3/27/16.
*/
"CFBundleDisplayName" = "Clocker";
"Thank you for helping make Clocker even better!" = "Obrigado por ajudar a tornar o Clocker ainda melhor!";
"iRateMessageTitle" = "Rate %@";
"iRateAppMessage" = "If you enjoy using %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
"iRateGameMessage" = "If you enjoy playing %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
"iRateCancelButton" = "Não, Obrigado";
"iRateRateButton" = "Avaliar Agora";
"iRateRemindButton" = "Lembrar mais tarde";
"iRateUpdateMessage" = "Atualizar agora?";
"ClockerVersion" = "Versão %@";
"CLFeedbackAlertTitle" = "Obrigado por ajudar a tornar o Clocker ainda melhor!";
"app-name" = "Clocker";
"start-at-login" = "Iniciar ao iniciar sessão";
"setup-steps" = "It only takes 3 steps to set up Clocker";
"Permissions-Header" = "Permissões";
"See your next Calendar event here." = "Veja seu próximo evento do Calendário aqui.";
"Click here to start." = "Clique aqui para iniciar.";
"Reminders Access" = "Acessos aos Lembretes";
"Calendar Access" = "Acesso ao Calendário";
"Permissions" = "Permissões";
"Calendar Detail" = "Próximos eventos de seus calendários pessoais e compartilhados podem ser exibidos no menu e no painel.";
"Reminders Detail" = "Defina lembretes no fuso horário da localização de sua escolha. Seus lembretes são armazenados no aplicativo padrão Lembretes.";
"Privacy Text" = "Você pode alterar isso mais tarde na seção Privacidade das Preferências do Sistema.";
"Granted Button Text" = "Granted";
"Denied Button Text" = "Denied";
"Grant Button Text" = "Conceder";
// Welcome Onboarding
"It only takes 3 steps to setup Clocker." = "São apenas 3 passos para configurar o Clocker.";
"Get Started" = "Get Started";
// Tab Item Titles
"Preferences Tab" = "Preferências";
"Appearance Tab" = "Aparência";
"Calendar Tab" = "Calendário";
"About Tab" = "Sobre";
"Permissions Tab" = "Permissões";
// General Preferences Screen
"Start at Login" = "Start Clocker at Login";
"Sort by Time Difference" = "Sort by Time Difference";
"Sort by Name" = "Ordenar por nome";
"Sort by Label" = "Ordenar por Etiqueta";
"Search Field Placeholder" = "Insira uma cidade, estado ou país";
"No Timezone Selected" = "Por favor, selecione um fuso horário!";
"Max Timezones Selected" = "Maximum 100 timezones allowed!";
"Max Search Characters" = "Só são permitidos até 50 caracteres!";
"Add Button Title" = "Adicionar";
"Close Button Title" = "Fechar";
// Onboarding
"Open Clocker At Login" = "Open Clocker At Login";
"Launch Clocker" = "Launch Clocker";
// Welcome Onboarding
"It only takes 3 steps to set up Clocker." = "It only takes 3 steps to setup Clocker.";
"Get Started" = "Get Started";
// Permissions
"Calendar Access Title" = "Acesso ao Calendário";
"Reminders Access Title" = "Reminders Access";
"Later Config Description" = "These can be configured later in System Preferences.";
"Back" = "Voltar";
"Continue" = "Continuar";
"Clocker is more useful when it can display events from your calendars." = "O bloqueador é mais útil quando pode exibir eventos de seus calendários.";
"Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy." = "O bloqueador é mais útil quando pode exibir eventos de seus calendários. Você pode alterar essa configuração em Preferências do Sistema › Segurança e Privacidade › Privacidade.";
"Launch Preferences" = "Launch Preferences";
"Grant Access" = "Grant Access";
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Próximos eventos de seus calendários pessoais e compartilhados podem ser exibidos no menu e no painel.";
"Granted" = "Granted";
"Denied" = "Denied";
"Grant" = "Grant";
"Unexpected" = "Inesperado";
// Onboarding Search
"Quick Add Locations" = "Quick Add Locations";
"More search options in Clocker Preferences." = "Mais opções de busca em Preferências do Clocker.";
"Enter 3 or more characters for locations you'll like to add" = "Enter 3 or more characters for locations you'll like to add";
// Start at Login
"Launch at Login" = "Launch at Login";
"This can be configured later in Clocker Preferences." = "Isso pode ser configurado mais tarde nas Preferências do Clocker.";
"Should Clocker open automatically on startup?" = "Should Clocker open automatically on startup?";
// Final Onboarding Screen
"You're all set!" = "Tudo pronto!";
"Thank you for the details." = "Obrigado pelos detalhes.";
"You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences." = "You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences.";
"If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!" = "Se você quiser nos ajudar a localizar o app no seu idioma ou receber atualizações pouco frequentes, digite seu e-mail!";
// Appearance Tab
"Panel Theme" = "Tema do painel";
"Favourite a timezone to enable menubar display options." = "Favourite a timezone to enable menubar display options.";
"Main Panel Options" = "Main Panel Options";
"Time Format" = "Time Format";
"Day Display Options" = "Day Display Options";
"Show Future Slider" = "Show Future Slider";
"Show Sunrise/Sunset" = "Show Sunrise/Sunset";
"Display the time in seconds" = "Exibir o tempo em segundos";
"Larger Text" = "Texto Maior";
"Future Slider Range" = "Future Slider Range";
"Include Date" = "Incluir Data";
"Include Day" = "Incluir Dia";
"Include Place Name" = "Incluir Nome do Lugar";
"Menubar Display Options" = "Menubar Display Options";
"Menubar Mode" = "Menubar Mode";
"Preview" = "Pré-visualizar";
"Miscellaneous" = "Miscellaneous";
// Empty View
"No places added" = "Nenhum local adicionado";
// Panel
"No upcoming event." = "Sem eventos futuros.";
"You have no events scheduled for tomorrow." = "Você não tem eventos agendados para amanhã.";
// Review
"Enjoy using Clocker?" = "Gostando de usar o Clocker?";
// App Feedback
"Tell us what you think!" = "Conte-nos o que você pensa!";
"Contact Information (Optional)" = "Informações de Contato (Opcional)";
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "Os campos de contato são opcionais! Suas informações de contato nos permitirão entrar em contato com você caso precisemos de mais informações ou possamos ajudar!";
// About View Screen
"Feedback is always welcome:" = "Feedback é sempre bem-vindo:";
// Calendars View
"Upcoming Event View Options" = "Upcoming Event View Options";
"Show Upcoming Event View" = "Show Upcoming Event View";
"Show All Day Meetings" = "Show All Day Meetings";
"Show Next Meeting Title in Menubar" = "Show Next Meeting Title in Menubar";
"Truncate menubar text longer than" = "Truncate menubar text longer than";
"characters" = "characters";
"Show events from" = "Show events from";
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"";
// Notes Popover
"Reminder Set" = "Reminder Set";
"Successfully set." = "Successfully set.";
// Errors
"You're offline, maybe?" = "You're offline, maybe?";
"Try again, maybe?" = "Try again, maybe?";
"The Internet connection appears to be offline." = "A conexão à Internet parece estar desligada.";
// UI Tests
"New Zealand" = "Nova Zelândia";
"Florida" = "Florida";
"San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

3
Clocker/Clocker/ru.lproj/Localizable.strings

@ -330,3 +330,6 @@
"Preview" = "Preview"; "Preview" = "Preview";
"Miscellaneous" = "Miscellaneous"; "Miscellaneous" = "Miscellaneous";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

471
Clocker/Clocker/zh-Hans.lproj/Localizable.strings

@ -1,332 +1,155 @@
/* (No Comment) */ /* (No Comment) */
"About Tab" = "About"; "CFBundleDisplayName" = "解锁器";
"Thank you for helping make Clocker even better!" = "感谢您帮助 Clocker 做得更好!";
"CFBundleDisplayName" = "Clocker"; "iRateMessageTitle" = "评价 %@";
"iRateAppMessage" = "如果您喜欢使用 %@,能否请您抽出时间来对它进行评价?评价不会超过一分钟。感谢您的支持 !";
/* Button to add a location */ "iRateGameMessage" = "如果您喜欢使用 %@,能否请您抽出时间来对它进行评价?评价不会超过一分钟。感谢您的支持 !";
"Add Button Title" = "Add"; "iRateCancelButton" = "不用了,谢谢";
"iRateRateButton" = "立即评分";
/* (No Comment) */ "iRateRemindButton" = "稍后提醒我";
"iRateUpdateMessage" = "现在更新?";
"ClockerVersion" = "版本 %@";
"CLFeedbackAlertTitle" = "感谢您帮助 Clocker 做得更好!";
"app-name" = "Clocker"; "app-name" = "Clocker";
"start-at-login" = "开启时启动";
/* (No Comment) */ "setup-steps" = "只需要三步来设置 Clocker";
"Appearance Tab" = "Appearance"; "Permissions-Header" = "权限";
"See your next Calendar event here." = "在这里查看你的下一个日历事件。";
/* Button title for going back to the previous screen */ "Click here to start." = "点此开始。";
"Back" = "Back"; "Reminders Access" = "提醒访问权限";
"Calendar Access" = "日历访问权限";
/* Calendar Permission Title */ "Permissions" = "权限";
"Calendar Access" = "Calendar Access"; "Calendar Detail" = "未来你个人和分享的日历事件将显示在菜单栏和面板上。";
"Reminders Detail" = "在您选择的位置时区设置提醒。您的提醒存储在默认提醒应用中。";
/* Title for Calendar access label */ "Privacy Text" = "您稍后可以在「系统偏好设置」的隐私部分更改此内容。";
"Calendar Access Title" = "Calendar Access"; "Granted Button Text" = "已授权";
"Denied Button Text" = "已拒绝";
/* Calendar Detail Text */
"Calendar Detail" = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
/* (No Comment) */
"Calendar Tab" = "Calendar";
/* (No Comment) */
"characters" = "characters";
/* (No Comment) */
"CLFeedbackAlertTitle" = "Thank you for helping make Clocker even better!";
/* Button Title for no Calendar access */
"Click here to start." = "Click here to start.";
/* (No Comment) */
"Clocker is more useful when it can display events from your calendars." = "Clocker is more useful when it can display events from your calendars.";
/* (No Comment) */
"Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy." = "Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy.";
/* (No Comment) */
"ClockerVersion" = "Version %@";
/* Button to close the panel */
"Close Button Title" = "Close";
/* (No Comment) */
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!";
/* (No Comment) */
"Contact Information (Optional)" = "Contact Information (Optional)";
/* Continue Button Title */
"Continue" = "Continue";
/* (No Comment) */
"Day Display Options" = "Day Display Options";
/* (No Comment) */
"Denied" = "Denied";
/* Denied Button Text */
"Denied Button Text" = "Denied";
/* (No Comment) */
"Display the time in seconds" = "Display the time in seconds";
/* Title asking users if they like the app */
"Enjoy using Clocker" = "Enjoy using Clocker";
/* Review */
"Enjoy using Clocker?" = "Enjoy using Clocker?";
/* (No Comment) */
"Favourite a timezone to enable menubar display options." = "Favourite a timezone to enable menubar display options.";
/* About View Screen */
"Feedback is always welcome:" = "Feedback is always welcome:";
/* (No Comment) */
"Florida" = "Florida";
/* (No Comment) */
"Future Slider Range" = "Future Slider Range";
/* Title for Welcome View Controller's Continue Button */
"Get Started" = "立刻开始!";
/* (No Comment) */
"Grant" = "授权";
/* (No Comment) */
"Grant Access" = "授予访问权限";
/* Grant Button Text */
"Grant Button Text" = "授权"; "Grant Button Text" = "授权";
/* (No Comment) */ // Welcome Onboarding
"It only takes 3 steps to setup Clocker." = "只需要 3 步来设置 Clocker。";
"Get Started" = "开始";
// Tab Item Titles
"Preferences Tab" = "首选项";
"Appearance Tab" = "外观";
"Calendar Tab" = "日历";
"About Tab" = "关于";
"Permissions Tab" = "权限";
// General Preferences Screen
"Start at Login" = "登录时启动 Clocker";
"Sort by Time Difference" = "按时间差排序";
"Sort by Name" = "按名称排序";
"Sort by Label" = "按标签排序";
"Search Field Placeholder" = "输入城市、省/州或国家名称";
"No Timezone Selected" = "请选择一个时区!";
"Max Timezones Selected" = "最多允许 100 个时区!";
"Max Search Characters" = "最多允许 50 个字符!";
"Add Button Title" = "添加";
"Close Button Title" = "关闭";
// Onboarding
"Open Clocker At Login" = "登录时启动 Clocker";
"Launch Clocker" = "启动 Clocker";
// Welcome Onboarding
"It only takes 3 steps to set up Clocker." = "只需要三步来设置 Clocker。";
"Get Started" = "现在开始";
// Permissions
"Calendar Access Title" = "访问日历";
"Reminders Access Title" = "访问提醒";
"Later Config Description" = "这些可以稍后在系统偏好设置中配置。";
"Back" = "返回";
"Continue" = "继续";
"Clocker is more useful when it can display events from your calendars." = "Clocker 能显示日历中的事件时会更有用。";
"Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy." = "Clocker 在能显示日历中的事件时更有用。你可以在「系统偏好设置 > 安全性与隐私 > 隐私」中更改设置。";
"Launch Preferences" = "打开首选项";
"Grant Access" = "授予访问权限";
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "你个人和共享日历的未来事件将显示在菜单栏和面板上。";
"Granted" = "已授权"; "Granted" = "已授权";
"Denied" = "已拒绝";
"Grant" = "授权";
"Unexpected" = "意外的";
/* Granted Button Text */ // Onboarding Search
"Granted Button Text" = "已授权"; "Quick Add Locations" = "快速添加地点";
"More search options in Clocker Preferences." = "Clocker 首选项中的更多搜索选项。";
/* (No Comment) */ "Enter 3 or more characters for locations you'll like to add" = "为您想要添加的位置输入 3 个或更多字符";
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"";
/* (No Comment) */
"If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!" = "If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!";
/* (No Comment) */
"Include Date" = "包含日期";
/* (No Comment) */
"Include Day" = "Include Day";
/* (No Comment) */
"Include Place Name" = "Include Place Name";
/* (No Comment) */
"iRateAppMessage" = "If you enjoy using %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
/* (No Comment) */
"iRateCancelButton" = "No, Thanks";
/* (No Comment) */
"iRateGameMessage" = "If you enjoy playing %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
/* (No Comment) */
"iRateMessageTitle" = "Rate %@";
/* (No Comment) */
"iRateRateButton" = "Rate It Now";
/* (No Comment) */
"iRateRemindButton" = "稍后提醒";
/* (No Comment) */
"iRateUpdateMessage" = "立即更新";
/* App Setup Description */
"It only takes 3 steps to set up Clocker." = "It only takes 3 steps to setup Clocker.";
/* Welcome Onboarding */
"It only takes 3 steps to setup Clocker." = "It only takes 3 steps to setup Clocker.";
/* (No Comment) */
"Larger Text" = "Larger Text";
/* Describing we can change the options later in System Preferences */
"Later Config Description" = "These can be configured later in System Preferences.";
/* Start at Login */ // Start at Login
"Launch at Login" = "登录时启动"; "Launch at Login" = "登录时启动";
"This can be configured later in Clocker Preferences." = "这可以稍后在 Clocker 首选项中进行配置。";
/* (No Comment) */ "Should Clocker open automatically on startup?" = "是否在启动时自动打开 Clocker?";
"Launch Clocker" = "Launch Clocker";
// Final Onboarding Screen
/* (No Comment) */ "You're all set!" = "已完成全部设置!";
"Launch Preferences" = "Launch Preferences"; "Thank you for the details." = "感谢您的详细信息。";
"You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences." = "当你启动应用时,会在菜单栏看到一个时钟图标。如果想在 Dock 上显示图标,请在首选项设置。";
/* (No Comment) */ "If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!" = "如果您想帮助翻译本应用或收到不定时的应用更新,请输入您的电子邮箱!";
"Main Panel Options" = "Main Panel Options";
// Appearance Tab
/* Max Character Count Allowed Error Message */ "Panel Theme" = "面板主题";
"Max Search Characters" = "Only 50 characters allowed!"; "Favourite a timezone to enable menubar display options." = "收藏一个时区以在菜单栏上显示可选项。";
"Main Panel Options" = "主面板选项";
/* Max Timezones Error Message */ "Time Format" = "时间格式";
"Max Timezones Selected" = "Maximum 100 timezones allowed!"; "Day Display Options" = "日显示选项";
"Show Future Slider" = "显示未来滑块";
/* (No Comment) */ "Show Sunrise/Sunset" = "显示日出/日落";
"Menubar Display Options" = "Menubar Display Options"; "Display the time in seconds" = "显示秒数";
"Larger Text" = "更大字号";
/* (No Comment) */ "Future Slider Range" = "未来滑块范围";
"Menubar Mode" = "Menubar Mode"; "Include Date" = "包含日期";
"Include Day" = "包含日";
/* (No Comment) */ "Include Place Name" = "包含地名";
"More search options in Clocker Preferences." = "More search options in Clocker Preferences."; "Menubar Display Options" = "菜单栏显示选项";
"Menubar Mode" = "菜单栏模式";
/* UI Tests */ "Preview" = "预览";
"New Zealand" = "New Zealand"; "Miscellaneous" = "杂项设置";
/* Subtitle for no places added */ // Empty View
"No places added" = "No places added"; "No places added" = "没有添加地点";
/* Message shown when the user taps on Add without selecting a timezone */ // Panel
"No Timezone Selected" = "Please select a timezone!"; "No upcoming event." = "暂无事项";
"You have no events scheduled for tomorrow." = "您明天没有安排。";
/* Title when there's no upcoming event */
"No upcoming event." = "No upcoming event."; // Review
"Enjoy using Clocker?" = "喜欢使用 Clocker 吗?";
/* Onboarding */
"Open Clocker At Login" = "Open Clocker At Login"; // App Feedback
"Tell us what you think!" = "告诉我们您的想法!";
/* Appearance Tab */ "Contact Information (Optional)" = "联系信息 (可选)";
"Panel Theme" = "Panel Theme"; "Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "联系人字段是可选项!我们需要更多信息或帮助时,将使用联络信息联络您!";
/* Permissions Tab Titles */ // About View Screen
"Permissions" = "Permissions"; "Feedback is always welcome:" = "欢迎提供反馈:";
/* Title for Permissions screen */ // Calendars View
"Permissions Tab" = "Permissions"; "Upcoming Event View Options" = "即将到来的事件视图选项";
"Show Upcoming Event View" = "显示即将到来的事件视图";
/* (No Comment) */ "Show All Day Meetings" = "显示全天会议";
"Permissions-Header" = "Permissions"; "Show Next Meeting Title in Menubar" = "在菜单栏中显示下一个会议标题";
"Truncate menubar text longer than" = "截断菜单栏文字长度大于";
/* Tab Item Titles */ "characters" = "字符";
"Preferences Tab" = "Preferences"; "Show events from" = "显示事件来源";
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "如果会议标题是“Meeting with Neel”,并且截断长度设置为 5 ,菜单栏的文本将显示为“Meeti...”";
/* Text explaining options can be changed in the future through System Preferences */
"Privacy Text" = "You can change this later in the Privacy section of the System Preferences."; // Notes Popover
"Reminder Set" = "提醒设置";
/* Onboarding Search */ "Successfully set." = "设置成功";
"Quick Add Locations" = "Quick Add Locations";
// Errors
/* Notes Popover */ "You're offline, maybe?" = "您已经离线?";
"Reminder Set" = "Reminder Set"; "Try again, maybe?" = "稍后再试?";
"The Internet connection appears to be offline." = "网络连接已断开。";
/* Reminders Permission Title */
"Reminders Access" = "Reminders Access"; // UI Tests
"New Zealand" = "新西兰";
/* Title for Reminders Access Label */ "Florida" = "佛罗里达";
"Reminders Access Title" = "Reminders Access"; "San Francisco" = "旧金山";
/* Reminders Detail Text */
"Reminders Detail" = "Set reminders in the timezone of the location of your choice. Your reminders are stored in the default Reminders app."; // DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";
/* (No Comment) */
"San Francisco" = "San Francisco";
/* Search Field Placeholder */
"Search Field Placeholder" = "Enter a city, state or country name";
/* (No Comment) */
"Enter 3 or more characters for locations you'll like to add" = "Enter 3 or more characters for locations you'll like to add";
/* Next Event Label for no Calendar access */
"See your next Calendar event here." = "See your next Calendar event here.";
/* (No Comment) */
"setup-steps" = "It only takes 3 steps to set up Clocker";
/* (No Comment) */
"Should Clocker open automatically on startup?" = "Should Clocker open automatically on startup?";
/* (No Comment) */
"Show All Day Meetings" = "Show All Day Meetings";
/* (No Comment) */
"Show events from" = "Show events from";
/* (No Comment) */
"Show Future Slider" = "Show Future Slider";
/* (No Comment) */
"Show Next Meeting Title in Menubar" = "Show Next Meeting Title in Menubar";
/* (No Comment) */
"Show Sunrise/Sunset" = "Show Sunrise/Sunset";
/* (No Comment) */
"Show Upcoming Event View" = "Show Upcoming Event View";
/* Start at Login */
"Sort by Label" = "Sort by Label";
/* Start at Login */
"Sort by Name" = "Sort by Name";
/* Start at Login */
"Sort by Time Difference" = "Sort by Time Difference";
/* Start at Login */
"Start at Login" = "Start Clocker at Login";
/* (No Comment) */
"start-at-login" = "登录时启动";
/* (No Comment) */
"Successfully set." = "Successfully set.";
/* App Feedback */
"Tell us what you think!" = "Tell us what you think!";
/* (No Comment) */
"Thank you for helping make Clocker even better!" = "Thank you for helping make Clocker even better!";
/* (No Comment) */
"Thank you for the details." = "Thank you for the details.";
/* (No Comment) */
"The Internet connection appears to be offline." = "The Internet connection appears to be offline.";
/* (No Comment) */
"This can be configured later in Clocker Preferences." = "This can be configured later in Clocker Preferences.";
/* (No Comment) */
"Time Format" = "Time Format";
/* (No Comment) */
"Truncate menubar text longer than" = "Truncate menubar text longer than";
/* (No Comment) */
"Try again, maybe?" = "Try again, maybe?";
/* (No Comment) */
"Unexpected" = "Unexpected";
/* Calendars View */
"Upcoming Event View Options" = "Upcoming Event View Options";
/* (No Comment) */
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
/* Title when there's no event scheduled for tomorrow */
"You have no events scheduled for tomorrow." = "You have no events scheduled for tomorrow.";
/* (No Comment) */
"You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences." = "You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences.";
/* Final Onboarding Screen */
"You're all set!" = "You're all set!";
/* Errors */
"You're offline, maybe?" = "You're offline, maybe?";
"Preview" = "Preview";
"Miscellaneous" = "Miscellaneous";

1
Clocker/ClockerUITests/AboutUsTests.swift

@ -34,6 +34,7 @@ class AboutUsTests: XCTestCase {
let appDisplayName = "CFBundleDisplayName".localizedString() let appDisplayName = "CFBundleDisplayName".localizedString()
let expectedVersion = "\(appDisplayName) 20.10.03 (83)" let expectedVersion = "\(appDisplayName) 20.10.03 (83)"
guard let presentVersion = app.windows["Clocker"].staticTexts["ClockerVersion"].value as? String else { guard let presentVersion = app.windows["Clocker"].staticTexts["ClockerVersion"].value as? String else {
XCTFail("Present version not present") XCTFail("Present version not present")
return return

6
Clocker/ClockerUITests/FloatingWindowTests.swift

@ -25,11 +25,11 @@ class FloatingWindowTests: XCTestCase {
} }
addUIInterruptionMonitor(withDescription: "Reminders Access") { (alert) -> Bool in addUIInterruptionMonitor(withDescription: "Reminders Access") { (alert) -> Bool in
print("Interruption Handler called") Logger.info("Interruption Handler called")
print(alert) Logger.info(alert)
let alertButton = alert.buttons["OK"] let alertButton = alert.buttons["OK"]
if alertButton.exists { if alertButton.exists {
print("Okay button found") Logger.info("Okay button found")
alertButton.tap() alertButton.tap()
return true return true
} }

14
Clocker/ClockerUITests/OnboardingTests.swift

@ -123,8 +123,8 @@ class OnboardingTests: XCTestCase {
private func startupControllerTests() { private func startupControllerTests() {
let onboardingWindow = app.windows["OnboardingWindow"] let onboardingWindow = app.windows["OnboardingWindow"]
XCTAssertTrue(onboardingWindow.buttons["Forward"].title == "Open Clocker At Login", "Forward button title's was unexpectedly wrong") XCTAssertTrue(onboardingWindow.buttons["Forward"].title == "Open Clocker At Login".localizedString(), "Forward button title's was unexpectedly wrong")
XCTAssertTrue(onboardingWindow.buttons["Alternate"].title == "Don't Open", "Alternate button title's was unexpectedly wrong") XCTAssertTrue(onboardingWindow.buttons["Alternate"].title == "Don't Open".localizedString(), "Alternate button title's was unexpectedly wrong")
XCTAssertTrue(onboardingWindow.staticTexts["Launch at Login".localizedString()].exists, "Header label's static text was unexpectedly wrong.") XCTAssertTrue(onboardingWindow.staticTexts["Launch at Login".localizedString()].exists, "Header label's static text was unexpectedly wrong.")
XCTAssertTrue(onboardingWindow.staticTexts["Should Clocker open automatically on startup?".localizedString()].exists, "Accessory label's static text was unexpectedly wrong.") XCTAssertTrue(onboardingWindow.staticTexts["Should Clocker open automatically on startup?".localizedString()].exists, "Accessory label's static text was unexpectedly wrong.")
@ -137,17 +137,17 @@ class OnboardingTests: XCTestCase {
XCTAssertTrue(onboardingWindow.buttons["Forward"].title == "Continue".localizedString(), "Forward button title's was unexpectedly wrong") XCTAssertTrue(onboardingWindow.buttons["Forward"].title == "Continue".localizedString(), "Forward button title's was unexpectedly wrong")
XCTAssertTrue(onboardingWindow.staticTexts["Quick Add Locations".localizedString()].exists, "Header label's static text was unexpectedly wrong.") XCTAssertTrue(onboardingWindow.staticTexts["Quick Add Locations".localizedString()].exists, "Header label's static text was unexpectedly wrong.")
XCTAssertTrue(onboardingWindow.staticTexts["More search options in Clocker Preferences."].exists, "Accessory label's static text was unexpectedly wrong.") XCTAssertTrue(onboardingWindow.staticTexts["More search options in Clocker Preferences.".localizedString()].exists, "Accessory label's static text was unexpectedly wrong.")
} }
private func finalOnboardingControllerTests() { private func finalOnboardingControllerTests() {
let onboardingWindow = app.windows["OnboardingWindow"] let onboardingWindow = app.windows["OnboardingWindow"]
// Let's test the buttons // Let's test the buttons
XCTAssertTrue(onboardingWindow.staticTexts["You're all set!"].exists, "Header label's static text was unexpectedly wrong.") XCTAssertTrue(onboardingWindow.staticTexts["You're all set!".localizedString()].exists, "Header label's static text was unexpectedly wrong.")
XCTAssertTrue(onboardingWindow.staticTexts["Thank you for the details."].exists, "Accessory label's static text was unexpectedly wrong.") XCTAssertTrue(onboardingWindow.staticTexts["Thank you for the details.".localizedString()].exists, "Accessory label's static text was unexpectedly wrong.")
XCTAssertFalse(onboardingWindow.buttons["Alternate"].exists, "Alternate button was unexpectedly present.") XCTAssertFalse(onboardingWindow.buttons["Alternate".localizedString()].exists, "Alternate button was unexpectedly present.")
XCTAssertTrue(onboardingWindow.buttons["Forward"].title == "Launch Clocker".localizedString(), "Forward button's title was unexpectedly wrong.") XCTAssertTrue(onboardingWindow.buttons["Forward".localizedString()].title == "Launch Clocker".localizedString(), "Forward button's title was unexpectedly wrong.")
} }
} }

4
Clocker/ClockerUITests/PreferencesTest.swift

@ -244,7 +244,7 @@ class PreferencesTest: XCTestCase {
XCTAssertTrue(maxCharacterQuery.count > 0) XCTAssertTrue(maxCharacterQuery.count > 0)
addAPlace(place: "asdakjhdasdahsdasd", to: app, shouldSleep: false) addAPlace(place: "asdakjhdasdahsdasd", to: app, shouldSleep: false)
XCTAssertTrue(app.sheets.staticTexts["Please select a timezone!"].exists) XCTAssertTrue(app.sheets.staticTexts["No Timezone Selected".localizedString()].exists)
let informativeLabelPredicate = NSPredicate(format: "placeholderValue like %@", "No results! 😔 Try entering the exact name.") let informativeLabelPredicate = NSPredicate(format: "placeholderValue like %@", "No results! 😔 Try entering the exact name.")
let sheets = app.sheets.firstMatch.staticTexts let sheets = app.sheets.firstMatch.staticTexts
@ -392,7 +392,7 @@ extension XCTestCase {
let isHittable = NSPredicate(format: "exists == true", "") let isHittable = NSPredicate(format: "exists == true", "")
let addExpectation = expectation(for: isHittable, let addExpectation = expectation(for: isHittable,
evaluatedWith: results.firstMatch) { () -> Bool in evaluatedWith: results.firstMatch) { () -> Bool in
print("Handler called") Logger.info("Handler called")
return true return true
} }

2
Clocker/Dependencies/Date Additions/TimeChunk.swift

@ -67,7 +67,7 @@ public struct TimeChunk {
*/ */
public func to(_ unit: TimeUnits) -> Int { public func to(_ unit: TimeUnits) -> Int {
if months != 0 { if months != 0 {
print("Months are not supported for conversion due to their uncertain number of days.") Logger.info("Months are not supported for conversion due to their uncertain number of days.")
return 0 return 0
} }
if unit == .seconds { if unit == .seconds {

8
Clocker/Dependencies/Date Additions/TimePeriod.swift

@ -390,7 +390,7 @@ public extension TimePeriodProtocol {
end = end?.add(chunk) end = end?.add(chunk)
case .center: case .center:
// Do not lengthen by TimeChunk at center // Do not lengthen by TimeChunk at center
print("Mutation via chunk from center anchor is not supported.") Logger.info("Mutation via chunk from center anchor is not supported.")
case .end: case .end:
beginning = beginning?.subtract(chunk) beginning = beginning?.subtract(chunk)
} }
@ -426,7 +426,7 @@ public extension TimePeriodProtocol {
end = end?.subtract(chunk) end = end?.subtract(chunk)
case .center: case .center:
// Do not shorten by TimeChunk at center // Do not shorten by TimeChunk at center
print("Mutation via chunk from center anchor is not supported.") Logger.info("Mutation via chunk from center anchor is not supported.")
case .end: case .end:
beginning = beginning?.add(chunk) beginning = beginning?.add(chunk)
} }
@ -561,7 +561,7 @@ open class TimePeriod: TimePeriodProtocol {
timePeriod.beginning = beginning timePeriod.beginning = beginning
timePeriod.end = end?.add(chunk) timePeriod.end = end?.add(chunk)
case .center: case .center:
print("Mutation via chunk from center anchor is not supported.") Logger.info("Mutation via chunk from center anchor is not supported.")
case .end: case .end:
timePeriod.beginning = beginning?.add(-chunk) timePeriod.beginning = beginning?.add(-chunk)
timePeriod.end = end timePeriod.end = end
@ -610,7 +610,7 @@ open class TimePeriod: TimePeriodProtocol {
timePeriod.beginning = beginning timePeriod.beginning = beginning
timePeriod.end = end?.subtract(chunk) timePeriod.end = end?.subtract(chunk)
case .center: case .center:
print("Mutation via chunk from center anchor is not supported.") Logger.info("Mutation via chunk from center anchor is not supported.")
case .end: case .end:
timePeriod.beginning = beginning?.add(-chunk) timePeriod.beginning = beginning?.add(-chunk)
timePeriod.end = end timePeriod.end = end

2
Clocker/Dependencies/Date Additions/TimePeriodChain.swift

@ -79,7 +79,7 @@ open class TimePeriodChain: TimePeriodGroup {
// Insert new period // Insert new period
periods.insert(period, at: index) periods.insert(period, at: index)
} else { } else {
print("All TimePeriods in a TimePeriodChain must contain a defined start and end date") Logger.info("All TimePeriods in a TimePeriodChain must contain a defined start and end date")
return return
} }

14
Clocker/Events and Reminders/CalendarHandler.swift

@ -66,7 +66,7 @@ extension EventCenter {
let timeForEventToStart = event.event.startDate.timeIntervalSinceNow / 60 let timeForEventToStart = event.event.startDate.timeIntervalSinceNow / 60
if timeForEventToStart > 30 { if timeForEventToStart > 30 {
print("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins") Logger.info("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins")
continue continue
} }
@ -209,12 +209,12 @@ extension EventCenter {
} }
} }
print("Fetched filtered events for \(filteredEvents.count) days\n") Logger.info("Fetched filtered events for \(filteredEvents.count) days\n")
return return
} }
print("Unable to filter events because user hasn't selected calendars") Logger.info("Unable to filter events because user hasn't selected calendars")
} }
func saveDefaultIdentifiersList() { func saveDefaultIdentifiersList() {
@ -224,7 +224,7 @@ extension EventCenter {
if !allCalendars.isEmpty { if !allCalendars.isEmpty {
UserDefaults.standard.set(allCalendars, forKey: CLSelectedCalendars) UserDefaults.standard.set(allCalendars, forKey: CLSelectedCalendars)
print("Finished saving all calendar identifiers in default") Logger.info("Finished saving all calendar identifiers in default")
self.filterEvents() self.filterEvents()
} }
} }
@ -259,7 +259,7 @@ extension EventCenter {
func fetchEvents(_ start: Int, _ end: Int) { func fetchEvents(_ start: Int, _ end: Int) {
if calendarAccessDenied() || calendarAccessNotDetermined() { if calendarAccessDenied() || calendarAccessNotDetermined() {
print("Refetching aborted because we don't have permission!") Logger.info("Refetching aborted because we don't have permission!")
return return
} }
@ -294,7 +294,7 @@ extension EventCenter {
while date.compare(final) == .orderedAscending { while date.compare(final) == .orderedAscending {
guard var nextDate = autoupdatingCalendar.date(byAdding: Calendar.Component.day, value: 1, to: date) else { guard var nextDate = autoupdatingCalendar.date(byAdding: Calendar.Component.day, value: 1, to: date) else {
print("Could not calculate end date") Logger.info("Could not calculate end date")
return return
} }
nextDate = autoupdatingCalendar.startOfDay(for: nextDate) nextDate = autoupdatingCalendar.startOfDay(for: nextDate)
@ -320,7 +320,7 @@ extension EventCenter {
eventsForDate = eventsForDateMapper eventsForDate = eventsForDateMapper
print("Fetched events for \(eventsForDate.count) days") Logger.info("Fetched events for \(eventsForDate.count) days")
filterEvents() filterEvents()
} }

2
Clocker/Events and Reminders/EventCenter.swift

@ -34,7 +34,7 @@ class EventCenter: NSObject {
} }
private func refetchAll() { private func refetchAll() {
print("\nRefetching events from the store") Logger.info("\nRefetching events from the store")
eventsForDate = [:] eventsForDate = [:]
filteredEvents = [:] filteredEvents = [:]

2
Clocker/Media.xcassets/Onboarding/Dark Menubar.imageset/Contents.json vendored

@ -5,7 +5,7 @@
"scale" : "1x" "scale" : "1x"
}, },
{ {
"filename" : "Screen Shot 2020-10-11 at 2.19.26 PM.png", "filename" : "Screen Shot 2020-10-11 at 2.16.37 PM.png",
"idiom" : "universal", "idiom" : "universal",
"scale" : "2x" "scale" : "2x"
}, },

BIN
Clocker/Media.xcassets/Onboarding/Dark Menubar.imageset/Screen Shot 2020-10-11 at 2.16.37 PM.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
Clocker/Media.xcassets/Onboarding/Dark Menubar.imageset/Screen Shot 2020-10-11 at 2.19.26 PM.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

2
Clocker/Menu Bar/MenubarHandler.swift

@ -45,7 +45,7 @@ class MenubarHandler: NSObject {
let timeForEventToStart = event.event.startDate.timeIntervalSinceNow / 60 let timeForEventToStart = event.event.startDate.timeIntervalSinceNow / 60
if timeForEventToStart > 30 { if timeForEventToStart > 30 {
print("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins") Logger.info("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins")
continue continue
} }

2
Clocker/Menu Bar/StatusContainerView.swift

@ -171,7 +171,7 @@ class StatusContainerView: NSView {
} }
if newWidth != frame.size.width, newWidth > frame.size.width + 2.0 { if newWidth != frame.size.width, newWidth > frame.size.width + 2.0 {
print("Correcting our width to \(newWidth) and the previous width was \(frame.size.width)") Logger.info("Correcting our width to \(newWidth) and the previous width was \(frame.size.width)")
frame = CGRect(x: frame.origin.x, y: frame.origin.y, width: newWidth, height: frame.size.height) frame = CGRect(x: frame.origin.x, y: frame.origin.y, width: newWidth, height: frame.size.height)
} }
} }

16
Clocker/Menu Bar/StatusItemHandler.swift

@ -56,7 +56,7 @@ class StatusItemHandler: NSObject {
setClockerIcon() setClockerIcon()
} }
print("\nStatus Bar Current State changed: \(currentState)\n") Logger.info("\nStatus Bar Current State changed: \(currentState)\n")
} }
} }
@ -191,7 +191,7 @@ class StatusItemHandler: NSObject {
menubarTimer?.tolerance = shouldDisplaySeconds ? 0.5 : 20 menubarTimer?.tolerance = shouldDisplaySeconds ? 0.5 : 20
guard let runLoopTimer = menubarTimer else { guard let runLoopTimer = menubarTimer else {
print("Timer is unexpectedly nil") Logger.info("Timer is unexpectedly nil")
return return
} }
@ -230,12 +230,12 @@ class StatusItemHandler: NSObject {
} else if let minutes = components.minute { } else if let minutes = components.minute {
components.minute = minutes + 1 components.minute = minutes + 1
} else { } else {
print("Unable to create date components for the menubar timewr") Logger.info("Unable to create date components for the menubar timewr")
return nil return nil
} }
guard let fireDate = nsCalendar.date(from: components) else { guard let fireDate = nsCalendar.date(from: components) else {
print("Unable to form Fire Date") Logger.info("Unable to form Fire Date")
return nil return nil
} }
@ -263,7 +263,7 @@ class StatusItemHandler: NSObject {
} }
private func setupForStandardTextMode() { private func setupForStandardTextMode() {
print("Initializing menubar timer") Logger.info("Initializing menubar timer")
// Let's invalidate the previous timer // Let's invalidate the previous timer
menubarTimer?.invalidate() menubarTimer?.invalidate()
@ -281,7 +281,7 @@ class StatusItemHandler: NSObject {
let menubarFavourites = DataStore.shared().menubarTimezones() ?? [] let menubarFavourites = DataStore.shared().menubarTimezones() ?? []
if menubarFavourites.isEmpty, DataStore.shared().shouldDisplay(.showMeetingInMenubar) == false { if menubarFavourites.isEmpty, DataStore.shared().shouldDisplay(.showMeetingInMenubar) == false {
print("Invalidating menubar timer!") Logger.info("Invalidating menubar timer!")
invalidation() invalidation()
@ -290,7 +290,7 @@ class StatusItemHandler: NSObject {
} }
} else if sync { } else if sync {
print("Invalidating menubar timer for sync purposes!") Logger.info("Invalidating menubar timer for sync purposes!")
invalidation() invalidation()
@ -299,7 +299,7 @@ class StatusItemHandler: NSObject {
} }
} else { } else {
print("Not stopping menubar timer!") Logger.info("Not stopping menubar timer!")
} }
} }

2
Clocker/Onboarding/FinalOnboardingViewController.swift

@ -98,7 +98,7 @@ class FinalOnboardingViewController: NSViewController {
private func extraData() -> [String: String]? { private func extraData() -> [String: String]? {
guard let validEmail = emailValidator.validate(field: emailTextField) else { guard let validEmail = emailValidator.validate(field: emailTextField) else {
print("Not sending up email because it was invalid") Logger.info("Not sending up email because it was invalid")
return nil return nil
} }

78
Clocker/Onboarding/Onboarding.storyboard

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="17154" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="fde-UX-327"> <document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="16097" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="fde-UX-327">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17154"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="16097"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
@ -46,7 +46,7 @@
</constraints> </constraints>
</containerView> </containerView>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="m1D-bY-RlD"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="m1D-bY-RlD">
<rect key="frame" x="362" y="13" width="101" height="32"/> <rect key="frame" x="367" y="13" width="95" height="32"/>
<buttonCell key="cell" type="push" title="Continue" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="5qt-i6-wXk"> <buttonCell key="cell" type="push" title="Continue" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="5qt-i6-wXk">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
@ -59,10 +59,10 @@ DQ
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kbp-ED-vvP"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kbp-ED-vvP">
<rect key="frame" x="13" y="-2" width="64" height="62"/> <rect key="frame" x="14" y="-1" width="70" height="61"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="50" id="nfD-s1-MfF"/> <constraint firstAttribute="height" constant="50" id="nfD-s1-MfF"/>
<constraint firstAttribute="width" constant="50" id="opl-FH-00w"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" id="opl-FH-00w"/>
</constraints> </constraints>
<buttonCell key="cell" type="push" title="Back" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Tfk-vV-OpF"> <buttonCell key="cell" type="push" title="Back" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Tfk-vV-OpF">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@ -73,7 +73,7 @@ DQ
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="W3z-nZ-e6B"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="W3z-nZ-e6B">
<rect key="frame" x="248" y="13" width="116" height="32"/> <rect key="frame" x="258" y="13" width="109" height="32"/>
<buttonCell key="cell" type="push" title="Don't Open" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="tPS-m0-NWm"> <buttonCell key="cell" type="push" title="Don't Open" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="tPS-m0-NWm">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
@ -168,7 +168,7 @@ DQ
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="N6Z-mh-pET"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="N6Z-mh-pET">
<rect key="frame" x="18" y="1" width="400" height="18"/> <rect key="frame" x="18" y="6" width="400" height="18"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" id="lMj-6p-4uB"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" id="lMj-6p-4uB">
<font key="font" size="13" name="Avenir-Book"/> <font key="font" size="13" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -176,7 +176,7 @@ DQ
</textFieldCell> </textFieldCell>
</textField> </textField>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="mF9-1w-sxR"> <customView translatesAutoresizingMaskIntoConstraints="NO" id="mF9-1w-sxR">
<rect key="frame" x="20" y="179" width="396" height="100"/> <rect key="frame" x="20" y="184" width="396" height="100"/>
<subviews> <subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="Lef-GT-zuM"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="Lef-GT-zuM">
<rect key="frame" x="8" y="72" width="157" height="18"/> <rect key="frame" x="8" y="72" width="157" height="18"/>
@ -187,7 +187,7 @@ DQ
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="O0s-Bu-IPq"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="O0s-Bu-IPq">
<rect key="frame" x="298" y="62" width="85" height="32"/> <rect key="frame" x="303" y="62" width="79" height="32"/>
<buttonCell key="cell" type="push" title="Action" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="BW3-qu-NiR"> <buttonCell key="cell" type="push" title="Action" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="BW3-qu-NiR">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
@ -205,7 +205,7 @@ DQ
</textFieldCell> </textFieldCell>
</textField> </textField>
<progressIndicator wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="Zhi-9z-C2u"> <progressIndicator wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="Zhi-9z-C2u">
<rect key="frame" x="249" y="71" width="16" height="16"/> <rect key="frame" x="253" y="71" width="16" height="16"/>
</progressIndicator> </progressIndicator>
</subviews> </subviews>
<constraints> <constraints>
@ -223,7 +223,7 @@ DQ
</constraints> </constraints>
</customView> </customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="4eB-eD-0jK"> <customView translatesAutoresizingMaskIntoConstraints="NO" id="4eB-eD-0jK">
<rect key="frame" x="20" y="39" width="396" height="100"/> <rect key="frame" x="20" y="44" width="396" height="100"/>
<subviews> <subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="noJ-fx-c1b"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="noJ-fx-c1b">
<rect key="frame" x="8" y="48" width="148" height="42"/> <rect key="frame" x="8" y="48" width="148" height="42"/>
@ -250,7 +250,7 @@ DQ
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dI2-oA-MBA"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dI2-oA-MBA">
<rect key="frame" x="298" y="52" width="85" height="32"/> <rect key="frame" x="303" y="52" width="79" height="32"/>
<buttonCell key="cell" type="push" title="Action" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="i5r-db-Pnw"> <buttonCell key="cell" type="push" title="Action" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="i5r-db-Pnw">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
@ -260,7 +260,7 @@ DQ
</connections> </connections>
</button> </button>
<progressIndicator wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="0GH-vY-2Du"> <progressIndicator wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="0GH-vY-2Du">
<rect key="frame" x="249" y="61" width="16" height="16"/> <rect key="frame" x="253" y="61" width="16" height="16"/>
</progressIndicator> </progressIndicator>
</subviews> </subviews>
<constraints> <constraints>
@ -291,7 +291,7 @@ DQ
</imageView> </imageView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="iMf-Uy-zAf"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="iMf-Uy-zAf">
<rect key="frame" x="120" y="324" width="308" height="16"/> <rect key="frame" x="120" y="324" width="308" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" placeholderString="Onboarding Info" id="MOO-BA-qzM"> <textFieldCell key="cell" placeholderString="Onboarding Info" id="MOO-BA-qzM">
<font key="font" size="12" name="Avenir-Book"/> <font key="font" size="12" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
@ -314,7 +314,7 @@ DQ
<constraint firstItem="N6Z-mh-pET" firstAttribute="leading" secondItem="mF9-1w-sxR" secondAttribute="leading" id="M5v-XW-L1V"/> <constraint firstItem="N6Z-mh-pET" firstAttribute="leading" secondItem="mF9-1w-sxR" secondAttribute="leading" id="M5v-XW-L1V"/>
<constraint firstItem="XfU-36-tPs" firstAttribute="top" secondItem="sib-OR-ym5" secondAttribute="top" constant="20" id="Ps0-DI-VvS"/> <constraint firstItem="XfU-36-tPs" firstAttribute="top" secondItem="sib-OR-ym5" secondAttribute="top" constant="20" id="Ps0-DI-VvS"/>
<constraint firstItem="4eB-eD-0jK" firstAttribute="trailing" secondItem="mF9-1w-sxR" secondAttribute="trailing" id="Twh-8s-2qe"/> <constraint firstItem="4eB-eD-0jK" firstAttribute="trailing" secondItem="mF9-1w-sxR" secondAttribute="trailing" id="Twh-8s-2qe"/>
<constraint firstItem="mF9-1w-sxR" firstAttribute="top" secondItem="iMf-Uy-zAf" secondAttribute="bottom" constant="45" id="X3I-8c-Qgd"/> <constraint firstItem="mF9-1w-sxR" firstAttribute="top" secondItem="iMf-Uy-zAf" secondAttribute="bottom" constant="40" id="X3I-8c-Qgd"/>
<constraint firstItem="N6Z-mh-pET" firstAttribute="top" secondItem="4eB-eD-0jK" secondAttribute="bottom" constant="20" id="bDb-bD-u40"/> <constraint firstItem="N6Z-mh-pET" firstAttribute="top" secondItem="4eB-eD-0jK" secondAttribute="bottom" constant="20" id="bDb-bD-u40"/>
<constraint firstItem="4eB-eD-0jK" firstAttribute="top" secondItem="mF9-1w-sxR" secondAttribute="bottom" constant="40" id="eDT-5v-xZY"/> <constraint firstItem="4eB-eD-0jK" firstAttribute="top" secondItem="mF9-1w-sxR" secondAttribute="bottom" constant="40" id="eDT-5v-xZY"/>
<constraint firstItem="pC3-D3-DSa" firstAttribute="leading" secondItem="XfU-36-tPs" secondAttribute="trailing" constant="20" id="lUs-se-BHO"/> <constraint firstItem="pC3-D3-DSa" firstAttribute="leading" secondItem="XfU-36-tPs" secondAttribute="trailing" constant="20" id="lUs-se-BHO"/>
@ -361,24 +361,16 @@ DQ
</constraints> </constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="ClockerIcon-512" id="p3m-Oi-4D1"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="ClockerIcon-512" id="p3m-Oi-4D1"/>
</imageView> </imageView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OpV-ID-Ygr">
<rect key="frame" x="120" y="324" width="94" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" placeholderString="Onboarding Info" id="Y20-SO-sAO">
<font key="font" size="12" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="70Q-lk-Lwh"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="70Q-lk-Lwh">
<rect key="frame" x="118" y="335" width="203" height="45"/> <rect key="frame" x="118" y="335" width="318" height="45"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="left" placeholderString="Screen Name" id="L5w-Cd-KTt"> <textFieldCell key="cell" lineBreakMode="truncatingTail" alignment="left" placeholderString="Screen Name" id="L5w-Cd-KTt">
<font key="font" size="33" name="Avenir-Book"/> <font key="font" size="33" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hLN-Aq-g8b"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hLN-Aq-g8b">
<rect key="frame" x="120" y="266" width="298" height="18"/> <rect key="frame" x="118" y="257" width="300" height="18"/>
<textFieldCell key="cell" lineBreakMode="clipping" placeholderString="Accessory Label" id="N7I-qA-txi"> <textFieldCell key="cell" lineBreakMode="clipping" placeholderString="Accessory Label" id="N7I-qA-txi">
<font key="font" size="13" name="Avenir-Book"/> <font key="font" size="13" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -386,25 +378,35 @@ DQ
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mDt-zc-oSU"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mDt-zc-oSU">
<rect key="frame" x="120" y="34" width="298" height="16"/> <rect key="frame" x="118" y="34" width="300" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" placeholderString="Alternate Way Description" id="TQL-aE-8L2"> <textFieldCell key="cell" lineBreakMode="clipping" placeholderString="Alternate Way Description" id="TQL-aE-8L2">
<font key="font" size="12" name="Avenir-Book"/> <font key="font" size="12" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="EFy-SB-jXa">
<rect key="frame" x="118" y="300" width="320" height="32"/>
<textFieldCell key="cell" selectable="YES" placeholderString="Multiline Label that can span multiple lines in the window. Languages like German have really long words." id="RrM-dN-89g">
<font key="font" size="12" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="hLN-Aq-g8b" firstAttribute="leading" secondItem="OpV-ID-Ygr" secondAttribute="leading" id="8tu-GJ-fhS"/> <constraint firstItem="EFy-SB-jXa" firstAttribute="top" secondItem="70Q-lk-Lwh" secondAttribute="bottom" constant="3" id="Ikv-w3-jqY"/>
<constraint firstItem="OpV-ID-Ygr" firstAttribute="leading" secondItem="70Q-lk-Lwh" secondAttribute="leading" constant="2" id="A14-rJ-Ein"/> <constraint firstItem="hLN-Aq-g8b" firstAttribute="leading" secondItem="EFy-SB-jXa" secondAttribute="leading" id="LOk-bE-f0r"/>
<constraint firstItem="hLN-Aq-g8b" firstAttribute="top" secondItem="OpV-ID-Ygr" secondAttribute="bottom" constant="40" id="DOy-tp-XHM"/>
<constraint firstAttribute="trailing" secondItem="mDt-zc-oSU" secondAttribute="trailing" constant="20" id="Nc6-gO-D8h"/> <constraint firstAttribute="trailing" secondItem="mDt-zc-oSU" secondAttribute="trailing" constant="20" id="Nc6-gO-D8h"/>
<constraint firstItem="EFy-SB-jXa" firstAttribute="leading" secondItem="70Q-lk-Lwh" secondAttribute="leading" id="UbP-E5-dUs"/>
<constraint firstItem="5Hu-Am-awL" firstAttribute="leading" secondItem="1dd-7B-Qgn" secondAttribute="leading" constant="20" id="YbY-Nf-3WG"/> <constraint firstItem="5Hu-Am-awL" firstAttribute="leading" secondItem="1dd-7B-Qgn" secondAttribute="leading" constant="20" id="YbY-Nf-3WG"/>
<constraint firstItem="70Q-lk-Lwh" firstAttribute="top" secondItem="5Hu-Am-awL" secondAttribute="top" id="aUd-GN-V5c"/> <constraint firstItem="70Q-lk-Lwh" firstAttribute="top" secondItem="5Hu-Am-awL" secondAttribute="top" id="aUd-GN-V5c"/>
<constraint firstAttribute="trailing" secondItem="hLN-Aq-g8b" secondAttribute="trailing" constant="20" id="e3v-NL-soi"/> <constraint firstAttribute="trailing" secondItem="hLN-Aq-g8b" secondAttribute="trailing" constant="20" id="e3v-NL-soi"/>
<constraint firstItem="OpV-ID-Ygr" firstAttribute="top" secondItem="70Q-lk-Lwh" secondAttribute="bottom" constant="-5" id="flv-ch-gpx"/> <constraint firstAttribute="trailing" secondItem="EFy-SB-jXa" secondAttribute="trailing" id="jTF-1F-7Wy"/>
<constraint firstAttribute="trailing" secondItem="70Q-lk-Lwh" secondAttribute="trailing" constant="2" id="kbz-wE-TJq"/>
<constraint firstItem="5Hu-Am-awL" firstAttribute="top" secondItem="1dd-7B-Qgn" secondAttribute="top" constant="20" id="leb-oe-hz0"/> <constraint firstItem="5Hu-Am-awL" firstAttribute="top" secondItem="1dd-7B-Qgn" secondAttribute="top" constant="20" id="leb-oe-hz0"/>
<constraint firstAttribute="bottom" secondItem="mDt-zc-oSU" secondAttribute="bottom" constant="34" id="nJd-hW-vtc"/> <constraint firstAttribute="bottom" secondItem="mDt-zc-oSU" secondAttribute="bottom" constant="34" id="nJd-hW-vtc"/>
<constraint firstItem="hLN-Aq-g8b" firstAttribute="top" secondItem="EFy-SB-jXa" secondAttribute="bottom" constant="25" id="qEJ-Pz-FwK"/>
<constraint firstItem="mDt-zc-oSU" firstAttribute="leading" secondItem="hLN-Aq-g8b" secondAttribute="leading" id="vjW-P3-Q1E"/> <constraint firstItem="mDt-zc-oSU" firstAttribute="leading" secondItem="hLN-Aq-g8b" secondAttribute="leading" id="vjW-P3-Q1E"/>
<constraint firstItem="70Q-lk-Lwh" firstAttribute="leading" secondItem="5Hu-Am-awL" secondAttribute="trailing" constant="20" id="z2h-c5-SFb"/> <constraint firstItem="70Q-lk-Lwh" firstAttribute="leading" secondItem="5Hu-Am-awL" secondAttribute="trailing" constant="20" id="z2h-c5-SFb"/>
</constraints> </constraints>
@ -412,13 +414,13 @@ DQ
<connections> <connections>
<outlet property="accessoryLabel" destination="hLN-Aq-g8b" id="O18-AV-96s"/> <outlet property="accessoryLabel" destination="hLN-Aq-g8b" id="O18-AV-96s"/>
<outlet property="appName" destination="70Q-lk-Lwh" id="HwJ-Yk-mzy"/> <outlet property="appName" destination="70Q-lk-Lwh" id="HwJ-Yk-mzy"/>
<outlet property="onboardingType" destination="OpV-ID-Ygr" id="R0V-0H-8jr"/> <outlet property="onboardingType" destination="EFy-SB-jXa" id="a0n-bM-ssq"/>
<outlet property="privacyLabel" destination="mDt-zc-oSU" id="rJ9-Hv-65Y"/> <outlet property="privacyLabel" destination="mDt-zc-oSU" id="rJ9-Hv-65Y"/>
</connections> </connections>
</viewController> </viewController>
<customObject id="gdU-Lx-HEm" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/> <customObject id="gdU-Lx-HEm" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="1495.5" y="750"/> <point key="canvasLocation" x="1495" y="750"/>
</scene> </scene>
<!--Onboarding Search Controller--> <!--Onboarding Search Controller-->
<scene sceneID="u6P-zw-bJP"> <scene sceneID="u6P-zw-bJP">
@ -646,11 +648,11 @@ DQ
</textFieldCell> </textFieldCell>
</textField> </textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="nbC-4o-Xjf"> <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="nbC-4o-Xjf">
<rect key="frame" x="122" y="246" width="294" height="23"/> <rect key="frame" x="122" y="245" width="294" height="24"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageAlignment="left" imageScaling="proportionallyDown" image="Dark Menubar" id="cZ2-x0-bJ2"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageAlignment="left" imageScaling="proportionallyDown" image="Dark Menubar" id="cZ2-x0-bJ2"/>
</imageView> </imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="kMo-BE-OAn"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="kMo-BE-OAn">
<rect key="frame" x="120" y="190" width="298" height="16"/> <rect key="frame" x="120" y="189" width="298" height="16"/>
<textFieldCell key="cell" selectable="YES" title="Multiline Label" id="M4F-nv-Eyo"> <textFieldCell key="cell" selectable="YES" title="Multiline Label" id="M4F-nv-Eyo">
<font key="font" size="12" name="Avenir-Book"/> <font key="font" size="12" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -658,7 +660,7 @@ DQ
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6WD-GP-iz1"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6WD-GP-iz1">
<rect key="frame" x="122" y="140" width="288" height="22"/> <rect key="frame" x="122" y="139" width="288" height="22"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="22" id="OvB-hh-3zl"/> <constraint firstAttribute="height" constant="22" id="OvB-hh-3zl"/>
</constraints> </constraints>
@ -669,7 +671,7 @@ DQ
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="qLP-tx-m41" customClass="UnderlinedButton" customModule="Clocker" customModuleProvider="target"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="qLP-tx-m41" customClass="UnderlinedButton" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="117" y="117" width="293" height="0.0"/> <rect key="frame" x="117" y="102" width="293" height="14"/>
<buttonCell key="cell" type="bevel" bezelStyle="rounded" alignment="left" imageScaling="proportionallyDown" inset="2" id="o87-us-e82"> <buttonCell key="cell" type="bevel" bezelStyle="rounded" alignment="left" imageScaling="proportionallyDown" inset="2" id="o87-us-e82">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" size="13" name="Avenir-Book"/> <font key="font" size="13" name="Avenir-Book"/>
@ -716,6 +718,6 @@ DQ
</scenes> </scenes>
<resources> <resources>
<image name="ClockerIcon-512" width="1024" height="1024"/> <image name="ClockerIcon-512" width="1024" height="1024"/>
<image name="Dark Menubar" width="285" height="23"/> <image name="Dark Menubar" width="276" height="24"/>
</resources> </resources>
</document> </document>

11
Clocker/Onboarding/OnboardingParentViewController.swift

@ -68,11 +68,11 @@ class OnboardingParentViewController: NSViewController {
[negativeButton, backButton].forEach { $0?.isHidden = true } [negativeButton, backButton].forEach { $0?.isHidden = true }
if #available(OSX 11.0, *) { // if #available(OSX 11.0, *) {
negativeButton.controlSize = .large // negativeButton.controlSize = .large
positiveButton.controlSize = .large // positiveButton.controlSize = .large
backButton.controlSize = .large // backButton.controlSize = .large
} // }
backButton.title = NSLocalizedString("Back", backButton.title = NSLocalizedString("Back",
comment: "Button title for going back to the previous screen") comment: "Button title for going back to the previous screen")
@ -310,7 +310,6 @@ class OnboardingParentViewController: NSViewController {
func logExitPoint() { func logExitPoint() {
let currentViewController = currentController() let currentViewController = currentController()
print(currentViewController)
Logger.log(object: currentViewController, for: "Onboarding Process Exit") Logger.log(object: currentViewController, for: "Onboarding Process Exit")
} }

12
Clocker/Onboarding/OnboardingSearchController.swift

@ -34,9 +34,9 @@ class OnboardingSearchController: NSViewController {
resultsTableView.dataSource = self resultsTableView.dataSource = self
resultsTableView.target = self resultsTableView.target = self
resultsTableView.doubleAction = #selector(doubleClickAction(_:)) resultsTableView.doubleAction = #selector(doubleClickAction(_:))
if #available(OSX 11.0, *) { // if #available(OSX 11.0, *) {
resultsTableView.style = .fullWidth // resultsTableView.style = .fullWidth
} // }
setup() setup()
@ -136,7 +136,7 @@ class OnboardingSearchController: NSViewController {
let decodedObject = try jsonDecoder.decode(Timezone.self, from: data) let decodedObject = try jsonDecoder.decode(Timezone.self, from: data)
return decodedObject return decodedObject
} catch { } catch {
print("decodedObject error: \n\(error)") Logger.info("decodedObject error: \n\(error)")
return nil return nil
} }
} }
@ -364,7 +364,7 @@ class OnboardingSearchController: NSViewController {
let decodedObject = try jsonDecoder.decode(SearchResult.self, from: data) let decodedObject = try jsonDecoder.decode(SearchResult.self, from: data)
return decodedObject return decodedObject
} catch { } catch {
print("decodedObject error: \n\(error)") Logger.info("decodedObject error: \n\(error)")
return nil return nil
} }
} }
@ -453,7 +453,7 @@ extension OnboardingSearchController: NSSearchFieldDelegate {
return false return false
} }
print("Not Handled") Logger.info("Not Handled")
// return true if the action was handled; otherwise false // return true if the action was handled; otherwise false
return false return false
} }

16
Clocker/Overall App/AppDefaults.swift

@ -67,17 +67,6 @@ class AppDefaults {
if defaults.object(forKey: CLThemeKey) == nil { if defaults.object(forKey: CLThemeKey) == nil {
Themer.shared().set(theme: 0) Themer.shared().set(theme: 0)
} }
// Set default to System theme for Mojave
if #available(macOS 10.14, *) {
if defaults.bool(forKey: CLDefaultThemeOnMojave) == false {
if isDarkModeOn() {
Themer.shared().set(theme: 2)
defaults.set(2, forKey: CLThemeKey)
}
defaults.set(true, forKey: CLDefaultThemeOnMojave)
}
}
} }
private class func showCompactModeAlert() { private class func showCompactModeAlert() {
@ -126,8 +115,9 @@ class AppDefaults {
CLShowMeetingInMenubar: 1, CLShowMeetingInMenubar: 1,
CLTruncateTextLength: 30, CLTruncateTextLength: 30,
CLSelectedCalendars: [], CLSelectedCalendars: [],
CLAppDisplayOptions: 1, CLAppDisplayOptions: 0,
CLMenubarCompactMode: 1] CLMenubarCompactMode: 1,
CLDisplayDSTTransitionInfo: 0]
} }
} }

3
Clocker/Overall App/DataStore.swift

@ -16,6 +16,7 @@ enum ViewType {
case placeInMenubar case placeInMenubar
case dayInMenubar case dayInMenubar
case menubarCompactMode case menubarCompactMode
case dstTransitionInfo
} }
class DataStore: NSObject { class DataStore: NSObject {
@ -138,6 +139,8 @@ class DataStore: NSObject {
return shouldDisplayHelper(CLShowDayInMenu) return shouldDisplayHelper(CLShowDayInMenu)
case .appDisplayOptions: case .appDisplayOptions:
return shouldDisplayHelper(CLAppDisplayOptions) return shouldDisplayHelper(CLAppDisplayOptions)
case .dstTransitionInfo:
return shouldDisplayHelper(CLDisplayDSTTransitionInfo)
case .menubarCompactMode: case .menubarCompactMode:
guard let value = retrieve(key: CLMenubarCompactMode) as? Int else { guard let value = retrieve(key: CLMenubarCompactMode) as? Int else {
return false return false

12
Clocker/Overall App/Logger.swift

@ -5,8 +5,16 @@ import os.log
import os.signpost import os.signpost
class Logger: NSObject { class Logger: NSObject {
class func log(object _: [String: Any]?, for _: NSString) { class func log(object annotations: [String: Any]?, for event: NSString) {
// TODO: Use a new analytics solution! if #available(OSX 10.14, *) {
os_log(.default, "[%@] - [%@]", event, annotations ?? [:])
}
}
class func info(_ message: String) {
if #available(OSX 10.14, *) {
os_log(.info, "%@", message)
}
} }
} }

2
Clocker/Overall App/Strings.swift

@ -35,5 +35,5 @@ let CLOnboaringTestsLaunchArgument = "isTestingTheOnboardingFlow"
let CLMenubarCompactMode = "com.abhishek.menubarCompactMode" let CLMenubarCompactMode = "com.abhishek.menubarCompactMode"
let CLDefaultMenubarMode = "com.abhishek.shouldDefaultToCompactMode" let CLDefaultMenubarMode = "com.abhishek.shouldDefaultToCompactMode"
let CLInstallHomeIndicatorObject = "installHomeIndicatorObject" let CLInstallHomeIndicatorObject = "installHomeIndicatorObject"
let CLDefaultThemeOnMojave = "com.abhishek.defaultHasBeenSetOnMacOsMojave"
let CLSwitchToCompactModeAlert = "com.abhishek.switchToCompactMode" let CLSwitchToCompactModeAlert = "com.abhishek.switchToCompactMode"
let CLDisplayDSTTransitionInfo = "com.abhishek.showDSTTransitionInfo"

31
Clocker/Overall App/Themer.swift

@ -151,8 +151,9 @@ extension Themer {
} }
func shutdownImage() -> NSImage { func shutdownImage() -> NSImage {
if #available(OSX 11.0, *) { if let symbolImageForShutdown = symbolImage(for: "ellipsis.circle") {
return symbolImage(for: "ellipsis.circle") return symbolImageForShutdown
} }
if #available(macOS 10.14, *) { if #available(macOS 10.14, *) {
@ -170,8 +171,8 @@ extension Themer {
} }
func preferenceImage() -> NSImage { func preferenceImage() -> NSImage {
if #available(OSX 11.0, *) { if let symbolImageForPreference = symbolImage(for: "gear") {
return symbolImage(for: "gear") return symbolImageForPreference
} }
if #available(macOS 10.14, *) { if #available(macOS 10.14, *) {
@ -187,13 +188,13 @@ extension Themer {
return return
themeIndex == .light themeIndex == .light
? NSImage(named: NSImage.Name("Settings"))! ? NSImage(named: NSImage.Name("Settings"))!
: NSImage(named: NSImage.Name("Settings-White"))! : NSImage(named: NSImage.Name("Settings-White"))!
} }
func pinImage() -> NSImage { func pinImage() -> NSImage {
if #available(OSX 11.0, *) { if let pinImage = symbolImage(for: "macwindow.on.rectangle") {
return symbolImage(for: "macwindow.on.rectangle") return pinImage
} }
if #available(macOS 10.14, *) { if #available(macOS 10.14, *) {
@ -316,8 +317,8 @@ extension Themer {
} }
func sharingImage() -> NSImage { func sharingImage() -> NSImage {
if #available(OSX 11.0, *) { if let sharingImage = symbolImage(for: "square.and.arrow.up.on.square.fill") {
return symbolImage(for: "square.and.arrow.up.on.square.fill") return sharingImage
} }
if #available(macOS 10.14, *) { if #available(macOS 10.14, *) {
@ -445,14 +446,14 @@ extension Themer {
NSColor(deviceRed: 42.0 / 255.0, green: 55.0 / 255.0, blue: 62.0 / 255.0, alpha: 1.0) NSColor(deviceRed: 42.0 / 255.0, green: 55.0 / 255.0, blue: 62.0 / 255.0, alpha: 1.0)
} }
func symbolImage(for name: String) -> NSImage { func symbolImage(for name: String) -> NSImage? {
assert(name.count > 0) assert(name.count > 0)
if #available(OSX 11.0, *) { if #available(OSX 11.0, *) {
return NSImage(systemSymbolName: name, return NSImage(systemSymbolName: name,
accessibilityDescription: name)! accessibilityDescription: name)!
} else { }
// Dummy image for older xcodes
return NSImage(named: NSImage.Name("Calendar Tab Icon"))! return nil
}
} }
} }

8
Clocker/Overall App/VersionUpdateHandler.swift

@ -96,7 +96,7 @@ class VersionUpdateHandler: NSObject {
} }
guard let appStoreId = appStoreID() else { guard let appStoreId = appStoreID() else {
print("No App Store ID was found for Clocker") Logger.info("No App Store ID was found for Clocker")
return URL(string: "")! return URL(string: "")!
} }
@ -197,7 +197,7 @@ class VersionUpdateHandler: NSObject {
if checkAtLaunch { if checkAtLaunch {
checkIfNewVersion() checkIfNewVersion()
} else if verboseLogging { } else if verboseLogging {
print("iVersion will not check for updatess because checkAtLaunch option is disabled") Logger.info("iVersion will not check for updatess because checkAtLaunch option is disabled")
} }
} }
@ -311,9 +311,9 @@ class VersionUpdateHandler: NSObject {
if remoteVersionsDict.count <= 0 { if remoteVersionsDict.count <= 0 {
if downloadError != nil { if downloadError != nil {
print("Update Check Failed because of \(downloadError!.localizedDescription)") Logger.info("Update Check Failed because of \(downloadError!.localizedDescription)")
} else { } else {
print("Version Update Check because an unknown error occurred") Logger.info("Version Update Check because an unknown error occurred")
} }
} }
return return

2
Clocker/Panel/Data Layer/TimezoneData.swift

@ -231,7 +231,7 @@ class TimezoneData: NSObject, NSCoding {
let old = NSKeyedUnarchiver.unarchiveObject(with: timezone) let old = NSKeyedUnarchiver.unarchiveObject(with: timezone)
if let oldModel = old as? CLTimezoneData { if let oldModel = old as? CLTimezoneData {
// Convert it to new model and add it // Convert it to new model and add it
print("We're still using old Objective-C models") Logger.info("We're still using old Objective-C models")
let newTimezone = TimezoneData(with: oldModel) let newTimezone = TimezoneData(with: oldModel)
newModels.append(newTimezone) newModels.append(newTimezone)
} else if let newModel = old as? TimezoneData { } else if let newModel = old as? TimezoneData {

35
Clocker/Panel/Data Layer/TimezoneDataOperations.swift

@ -33,6 +33,39 @@ extension TimezoneDataOperations {
return dateFormatter.string(from: newDate) return dateFormatter.string(from: newDate)
} }
func nextDaylightSavingsTransitionIfAvailable(with sliderValue: Int) -> String? {
let currentTimezone = TimeZone(identifier: dataObject.timezone())
guard let nextDaylightSavingsTransition = currentTimezone?.nextDaylightSavingTimeTransition else {
return nil
}
guard let newDate = TimezoneDataOperations.gregorianCalendar?.date(byAdding: .minute,
value: sliderValue,
to: Date(),
options: .matchFirst) else {
assertionFailure("Data was unexpectedly nil")
return nil
}
let calendar = Calendar.autoupdatingCurrent
let numberOfDays = nextDaylightSavingsTransition.days(from: newDate, calendar: calendar)
// We'd like to show upcoming DST changes within the 7 day range.
// Using 8 as a fail-safe as timezones behind CDT can sometimes be wrongly attributed
if numberOfDays > 8 || numberOfDays < 0 {
return nil
}
if numberOfDays == 0 {
let hoursLeft = nextDaylightSavingsTransition.hours(from: newDate)
let suffix = hoursLeft == 1 ? "hour" : "hours"
return "Heads up! DST transition will occur in \(hoursLeft) \(suffix)."
}
let suffix = numberOfDays == 1 ? "day" : "days"
return "Heads up! DST transition will occur in \(numberOfDays) \(suffix)."
}
private func checkForUpcomingEvents() -> (String, String)? { private func checkForUpcomingEvents() -> (String, String)? {
if DataStore.shared().shouldDisplay(.showMeetingInMenubar) { if DataStore.shared().shouldDisplay(.showMeetingInMenubar) {
let filteredDates = EventCenter.sharedCenter().eventsForDate let filteredDates = EventCenter.sharedCenter().eventsForDate
@ -46,7 +79,7 @@ extension TimezoneDataOperations {
let timeForEventToStart = event.event.startDate.timeIntervalSinceNow / 60 let timeForEventToStart = event.event.startDate.timeIntervalSinceNow / 60
if timeForEventToStart > 30 { if timeForEventToStart > 30 {
print("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins") Logger.info("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins")
continue continue
} }

4
Clocker/Panel/Notes Popover/NotesPopover.swift

@ -150,7 +150,7 @@ class NotesPopover: NSViewController {
} }
private func getCurrentTimezoneDate(completionHandler: @escaping (_ response: Date?) -> Void) { private func getCurrentTimezoneDate(completionHandler: @escaping (_ response: Date?) -> Void) {
guard let timezoneID = dataObject?.timezoneID else { guard let timezoneID = dataObject?.timezone() else {
assertionFailure("Unable to retrieve timezoneID from the model") assertionFailure("Unable to retrieve timezoneID from the model")
completionHandler(nil) completionHandler(nil)
return return
@ -353,7 +353,7 @@ class NotesPopover: NSViewController {
let alertIndex = alertPopupButton.indexOfSelectedItem let alertIndex = alertPopupButton.indexOfSelectedItem
if eventCenter.createReminder(with: model.customLabel!, if eventCenter.createReminder(with: model.customLabel!,
timezone: model.timezoneID!, timezone: model.timezone(),
alertIndex: alertIndex, alertIndex: alertIndex,
reminderDate: reminderPicker.dateValue, reminderDate: reminderPicker.dateValue,
additionalNotes: model.note) { additionalNotes: model.note) {

4
Clocker/Panel/PanelController.swift

@ -239,7 +239,7 @@ class PanelController: ParentPanelController {
} }
private func startTimer() { private func startTimer() {
print("Start timer called") Logger.info("Start timer called")
parentTimer = Repeater(interval: .seconds(1), mode: .infinite) { _ in parentTimer = Repeater(interval: .seconds(1), mode: .infinite) { _ in
OperationQueue.main.addOperation { OperationQueue.main.addOperation {
@ -254,7 +254,7 @@ class PanelController: ParentPanelController {
if count >= 1 || DataStore.shared().shouldDisplay(.showMeetingInMenubar) { if count >= 1 || DataStore.shared().shouldDisplay(.showMeetingInMenubar) {
if let delegate = NSApplication.shared.delegate as? AppDelegate { if let delegate = NSApplication.shared.delegate as? AppDelegate {
print("\nWe will be invalidating the menubar timer as we want the parent timer to take care of both panel and menubar ") Logger.info("\nWe will be invalidating the menubar timer as we want the parent timer to take care of both panel and menubar ")
delegate.invalidateMenubarTimer(false) delegate.invalidateMenubarTimer(false)
} }

33
Clocker/Panel/ParentPanelController.swift

@ -81,10 +81,11 @@ class ParentPanelController: NSWindowController {
@IBOutlet var sliderDatePicker: NSDatePicker! @IBOutlet var sliderDatePicker: NSDatePicker!
@IBOutlet var modernSlider: NSCollectionView!
@IBOutlet var roundedDateView: NSView! @IBOutlet var roundedDateView: NSView!
// Modern Slider
@IBOutlet var modernSlider: NSCollectionView!
var defaultPreferences: [Data] { var defaultPreferences: [Data] {
return DataStore.shared().timezones() return DataStore.shared().timezones()
} }
@ -167,9 +168,9 @@ class ParentPanelController: NSWindowController {
name: NSNotification.Name.NSSystemTimeZoneDidChange, name: NSNotification.Name.NSSystemTimeZoneDidChange,
object: nil) object: nil)
if #available(OSX 11.0, *) { // if #available(OSX 11.0, *) {
mainTableView.style = .fullWidth // mainTableView.style = .fullWidth
} // }
if modernSlider != nil { if modernSlider != nil {
modernSlider.enclosingScrollView?.scrollerInsets = NSEdgeInsets(top: 0, left: 0, bottom: 100, right: 0) modernSlider.enclosingScrollView?.scrollerInsets = NSEdgeInsets(top: 0, left: 0, bottom: 100, right: 0)
@ -383,6 +384,10 @@ class ParentPanelController: NSWindowController {
newHeight = userFontSize == 4 ? 68.0 : 68.0 newHeight = userFontSize == 4 ? 68.0 : 68.0
if let note = object?.note, note.isEmpty == false { if let note = object?.note, note.isEmpty == false {
newHeight += 20 newHeight += 20
} else if DataStore.shared().shouldDisplay(.dstTransitionInfo),
let obj = object,
TimezoneDataOperations(with: obj).nextDaylightSavingsTransitionIfAvailable(with: futureSliderValue) != nil {
newHeight += 20
} }
} }
@ -390,7 +395,7 @@ class ParentPanelController: NSWindowController {
// Set it to 90 expicity in case the row height is calculated be higher. // Set it to 90 expicity in case the row height is calculated be higher.
newHeight = 88.0 newHeight = 88.0
if let note = object?.note, note.isEmpty { if let note = object?.note, note.isEmpty, DataStore.shared().shouldDisplay(.dstTransitionInfo) == false, let obj = object, TimezoneDataOperations(with: obj).nextDaylightSavingsTransitionIfAvailable(with: futureSliderValue) == nil {
newHeight -= 20.0 newHeight -= 20.0
} }
} }
@ -560,6 +565,14 @@ class ParentPanelController: NSWindowController {
cellView.relativeDate.stringValue = dataOperation.date(with: futureSliderValue, displayType: .panelDisplay) cellView.relativeDate.stringValue = dataOperation.date(with: futureSliderValue, displayType: .panelDisplay)
cellView.currentLocationIndicator.isHidden = !model.isSystemTimezone cellView.currentLocationIndicator.isHidden = !model.isSystemTimezone
cellView.sunriseImage.image = model.isSunriseOrSunset ? Themer.shared().sunriseImage() : Themer.shared().sunsetImage() cellView.sunriseImage.image = model.isSunriseOrSunset ? Themer.shared().sunriseImage() : Themer.shared().sunsetImage()
if let note = model.note, !note.isEmpty {
cellView.noteLabel.stringValue = note
} else if DataStore.shared().shouldDisplay(.dstTransitionInfo),
let value = TimezoneDataOperations(with: model).nextDaylightSavingsTransitionIfAvailable(with: futureSliderValue) {
cellView.noteLabel.stringValue = value
} else {
cellView.noteLabel.stringValue = CLEmptyString
}
cellView.layout(with: model) cellView.layout(with: model)
updateDatePicker() updateDatePicker()
} }
@ -1018,19 +1031,17 @@ extension ParentPanelController: NSSharingServicePickerDelegate {
} }
extension ParentPanelController: NSCollectionViewDataSource, NSCollectionViewDelegate { extension ParentPanelController: NSCollectionViewDataSource, NSCollectionViewDelegate {
static let markerUserIdentifier = "HourMarkerViewItem"
func collectionView(_: NSCollectionView, numberOfItemsInSection _: Int) -> Int { func collectionView(_: NSCollectionView, numberOfItemsInSection _: Int) -> Int {
return 24 return 24
} }
func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem { func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
let item = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(ParentPanelController.markerUserIdentifier), for: indexPath) as! HourMarkerViewItem let item = collectionView.makeItem(withIdentifier: HourMarkerViewItem.reuseIdentifier, for: indexPath) as! HourMarkerViewItem
item.setup(with: indexPath) item.setup(with: indexPath.item)
return item return item
} }
func collectionView(_: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) { func collectionView(_: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {
Swift.print("Did Select Item at \(indexPaths.description)") Logger.info("Did Select Item at \(indexPaths.description)")
} }
} }

31
Clocker/Panel/UI/HourMarkerViewItem.swift

@ -3,13 +3,34 @@
import Cocoa import Cocoa
class HourMarkerViewItem: NSCollectionViewItem { class HourMarkerViewItem: NSCollectionViewItem {
static let reuseIdentifier = NSUserInterfaceItemIdentifier("HourMarkerViewItem")
@IBOutlet var hourLabel: NSTextField! @IBOutlet var hourLabel: NSTextField!
func setup(with indexPath: IndexPath) { func setup(with hour: Int) {
hourLabel.stringValue = "\(indexPath.item):00" var dateComponents = DateComponents()
if indexPath.item == 2 { dateComponents.hour = hour
highlightState = .forSelection
isSelected = true if let newDate = Calendar.autoupdatingCurrent.date(byAdding: dateComponents, to: Date().nextHour) {
let dateFormatter = DateFormatterManager.dateFormatterWithFormat(with: .none,
format: "HH:mm",
timezoneIdentifier: TimeZone.current.identifier,
locale: Locale.autoupdatingCurrent)
hourLabel.stringValue = dateFormatter.string(from: newDate)
} }
} }
override var acceptsFirstResponder: Bool {
return false
}
}
extension Date {
public var nextHour: Date {
let calendar = Calendar.current
let minutes = calendar.component(.minute, from: self)
let components = DateComponents(hour: 1, minute: -minutes)
return calendar.date(byAdding: components, to: self) ?? self
}
} }

4
Clocker/Panel/UI/HourMarkerViewItem.xib

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17154" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17156" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17154"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17156"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<objects> <objects>

2
Clocker/Panel/UI/PanelTableView.swift

@ -90,7 +90,7 @@ class PanelTableView: NSTableView {
private func evaluateForHighlight(at point: NSPoint) { private func evaluateForHighlight(at point: NSPoint) {
if enableHover == false { if enableHover == false {
print("Unable to show hover button because window is occluded!") Logger.info("Unable to show hover button because window is occluded!")
return return
} }

14
Clocker/Panel/UI/TimezoneDataSource.swift

@ -58,11 +58,17 @@ extension TimezoneDataSource: NSTableViewDataSource, NSTableViewDelegate {
cellView.rowNumber = row cellView.rowNumber = row
cellView.customName.stringValue = currentModel.formattedTimezoneLabel() cellView.customName.stringValue = currentModel.formattedTimezoneLabel()
cellView.time.stringValue = operation.time(with: sliderValue) cellView.time.stringValue = operation.time(with: sliderValue)
cellView.noteLabel.stringValue = currentModel.note ?? CLEmptyString
cellView.noteLabel.toolTip = currentModel.note ?? CLEmptyString cellView.noteLabel.toolTip = currentModel.note ?? CLEmptyString
cellView.currentLocationIndicator.isHidden = !currentModel.isSystemTimezone cellView.currentLocationIndicator.isHidden = !currentModel.isSystemTimezone
cellView.time.setAccessibilityIdentifier("ActualTime") cellView.time.setAccessibilityIdentifier("ActualTime")
cellView.relativeDate.setAccessibilityIdentifier("RelativeDate") cellView.relativeDate.setAccessibilityIdentifier("RelativeDate")
if let note = currentModel.note, !note.isEmpty {
cellView.noteLabel.stringValue = note
} else if DataStore.shared().shouldDisplay(.dstTransitionInfo), let value = operation.nextDaylightSavingsTransitionIfAvailable(with: sliderValue) {
cellView.noteLabel.stringValue = value
} else {
cellView.noteLabel.stringValue = CLEmptyString
}
cellView.layout(with: currentModel) cellView.layout(with: currentModel)
cellView.setAccessibilityIdentifier(currentModel.formattedTimezoneLabel()) cellView.setAccessibilityIdentifier(currentModel.formattedTimezoneLabel())
@ -91,11 +97,13 @@ extension TimezoneDataSource: NSTableViewDataSource, NSTableViewDelegate {
} }
if let note = model.note, !note.isEmpty { if let note = model.note, !note.isEmpty {
rowHeight += userFontSize.intValue + 25 rowHeight += userFontSize.intValue + 15
} else if DataStore.shared().shouldDisplay(.dstTransitionInfo), TimezoneDataOperations(with: model).nextDaylightSavingsTransitionIfAvailable(with: sliderValue) != nil {
rowHeight += userFontSize.intValue + 15
} }
if model.isSystemTimezone { if model.isSystemTimezone {
rowHeight += 5 rowHeight += 2
} }
rowHeight += (userFontSize.intValue * 2) rowHeight += (userFontSize.intValue * 2)

18
Clocker/Preferences/Appearance/AppearanceViewController.swift

@ -104,8 +104,9 @@ class AppearanceViewController: ParentViewController {
let shouldDisplayCompact = DataStore.shared().shouldDisplay(.menubarCompactMode) let shouldDisplayCompact = DataStore.shared().shouldDisplay(.menubarCompactMode)
menubarMode.setSelected(true, forSegment: shouldDisplayCompact ? 0 : 1) menubarMode.setSelected(true, forSegment: shouldDisplayCompact ? 0 : 1)
// True is Menubar Only and False is Menubar + Dock
let appDisplayOptions = DataStore.shared().shouldDisplay(.appDisplayOptions) let appDisplayOptions = DataStore.shared().shouldDisplay(.appDisplayOptions)
appDisplayControl.setSelected(true, forSegment: appDisplayOptions ? 1 : 0) appDisplayControl.setSelected(true, forSegment: appDisplayOptions ? 0 : 1)
} }
@IBOutlet var timeFormatLabel: NSTextField! @IBOutlet var timeFormatLabel: NSTextField!
@ -330,6 +331,10 @@ class AppearanceViewController: ParentViewController {
@IBAction func fontSliderChanged(_: Any) { @IBAction func fontSliderChanged(_: Any) {
previewPanelTableView.reloadData() previewPanelTableView.reloadData()
} }
@IBAction func toggleDSTTransitionOption(_: Any) {
previewPanelTableView.reloadData()
}
} }
extension AppearanceViewController: NSTableViewDataSource, NSTableViewDelegate { extension AppearanceViewController: NSTableViewDataSource, NSTableViewDelegate {
@ -356,8 +361,13 @@ extension AppearanceViewController: NSTableViewDataSource, NSTableViewDelegate {
cellView.rowNumber = row cellView.rowNumber = row
cellView.customName.stringValue = currentModel.formattedTimezoneLabel() cellView.customName.stringValue = currentModel.formattedTimezoneLabel()
cellView.time.stringValue = operation.time(with: 0) cellView.time.stringValue = operation.time(with: 0)
cellView.noteLabel.stringValue = currentModel.note ?? CLEmptyString if DataStore.shared().shouldDisplay(.dstTransitionInfo) {
cellView.noteLabel.toolTip = currentModel.note ?? CLEmptyString cellView.noteLabel.stringValue = "Heads up! DST Transition will occur in 3 days."
} else if let note = currentModel.note, !note.isEmpty {
cellView.noteLabel.stringValue = note
} else {
cellView.noteLabel.stringValue = CLEmptyString
}
cellView.currentLocationIndicator.isHidden = !currentModel.isSystemTimezone cellView.currentLocationIndicator.isHidden = !currentModel.isSystemTimezone
cellView.time.setAccessibilityIdentifier("ActualTime") cellView.time.setAccessibilityIdentifier("ActualTime")
cellView.layout(with: currentModel) cellView.layout(with: currentModel)
@ -375,6 +385,8 @@ extension AppearanceViewController: NSTableViewDataSource, NSTableViewDelegate {
let rowHeight: Int = userFontSize == 4 ? 60 : 65 let rowHeight: Int = userFontSize == 4 ? 60 : 65
if let note = model.note, !note.isEmpty { if let note = model.note, !note.isEmpty {
return CGFloat(rowHeight + userFontSize.intValue + 25) return CGFloat(rowHeight + userFontSize.intValue + 25)
} else if DataStore.shared().shouldDisplay(.dstTransitionInfo) {
return CGFloat(rowHeight + userFontSize.intValue + 25)
} }
return CGFloat(rowHeight + (userFontSize.intValue * 2)) return CGFloat(rowHeight + (userFontSize.intValue * 2))

2
Clocker/Preferences/Calendar/CalendarViewController.swift

@ -146,7 +146,7 @@ class CalendarViewController: ParentViewController {
if sender.selectedSegment == 0 { if sender.selectedSegment == 0 {
if let isValid = statusItemHandler.menubarTimer?.isValid, isValid == true { if let isValid = statusItemHandler.menubarTimer?.isValid, isValid == true {
print("Timer is already in progress") Logger.info("Timer is already in progress")
updateStatusItem() updateStatusItem()
return return
} }

2
Clocker/Preferences/General/PreferencesDataSource.swift

@ -130,7 +130,7 @@ extension PreferencesDataSource: NSTableViewDataSource {
return model.formattedAddress return model.formattedAddress
} }
return model.timezoneID return model.timezone()
} }
func tableView(_: NSTableView, setObjectValue object: Any?, for _: NSTableColumn?, row: Int) { func tableView(_: NSTableView, setObjectValue object: Any?, for _: NSTableColumn?, row: Int) {

18
Clocker/Preferences/General/PreferencesViewController.swift

@ -41,7 +41,7 @@ class PreferencesViewController: ParentViewController {
guard let path = Bundle.main.path(forResource: "Keys", ofType: "plist"), guard let path = Bundle.main.path(forResource: "Keys", ofType: "plist"),
let dictionary = NSDictionary(contentsOfFile: path), let dictionary = NSDictionary(contentsOfFile: path),
let apiKey = dictionary["GeocodingKey"] as? String else { let apiKey = dictionary["GeocodingKey"] as? String else {
assertionFailure("Unable to find the API key") // assertionFailure("Unable to find the API key")
return "" return ""
} }
return apiKey return apiKey
@ -420,7 +420,7 @@ extension PreferencesViewController {
self.placeholderLabel.placeholderString = "Searching for \(searchString)" self.placeholderLabel.placeholderString = "Searching for \(searchString)"
print(self.placeholderLabel.placeholderString ?? "") Logger.info(self.placeholderLabel.placeholderString ?? "")
self.dataTask = NetworkManager.task(with: self.generateSearchURL(), self.dataTask = NetworkManager.task(with: self.generateSearchURL(),
completionHandler: { [weak self] response, error in completionHandler: { [weak self] response, error in
@ -474,7 +474,7 @@ extension PreferencesViewController {
return false return false
} }
print(searchResultsDataSource.timezoneFilteredArray) Logger.info(searchResultsDataSource.timezoneFilteredArray.debugDescription)
} }
private func generateSearchURL() -> String { private func generateSearchURL() -> String {
@ -528,7 +528,7 @@ extension PreferencesViewController {
private func reloadSearchResults() { private func reloadSearchResults() {
if searchResultsDataSource.calculateChangesets() { if searchResultsDataSource.calculateChangesets() {
print("Reloading Search Results") Logger.info("Reloading Search Results")
availableTimezoneTableView.reloadData() availableTimezoneTableView.reloadData()
} }
} }
@ -540,7 +540,7 @@ extension PreferencesViewController {
let decodedObject = try jsonDecoder.decode(SearchResult.self, from: data) let decodedObject = try jsonDecoder.decode(SearchResult.self, from: data)
return decodedObject return decodedObject
} catch { } catch {
print("decodedObject error: \n\(error)") Logger.info("decodedObject error: \n\(error)")
return nil return nil
} }
} }
@ -552,7 +552,7 @@ extension PreferencesViewController {
let decodedObject = try jsonDecoder.decode(Timezone.self, from: data) let decodedObject = try jsonDecoder.decode(Timezone.self, from: data)
return decodedObject return decodedObject
} catch { } catch {
print("decodedObject error: \n\(error)") Logger.info("decodedObject error: \n\(error)")
return nil return nil
} }
} }
@ -633,7 +633,7 @@ extension PreferencesViewController {
// Mark if the timezone is same as local timezone // Mark if the timezone is same as local timezone
let timezoneObject = TimezoneData(with: newTimeZone) let timezoneObject = TimezoneData(with: newTimeZone)
timezoneObject.isSystemTimezone = timezoneObject.timezoneID == NSTimeZone.system.identifier timezoneObject.isSystemTimezone = timezoneObject.timezone() == NSTimeZone.system.identifier
let operationsObject = TimezoneDataOperations(with: timezoneObject) let operationsObject = TimezoneDataOperations(with: timezoneObject)
operationsObject.saveObject() operationsObject.saveObject()
@ -950,8 +950,8 @@ extension PreferencesViewController {
return false return false
} }
let timezone1 = NSTimeZone(name: object1.timezoneID!) let timezone1 = NSTimeZone(name: object1.timezone())
let timezone2 = NSTimeZone(name: object2.timezoneID!) let timezone2 = NSTimeZone(name: object2.timezone())
let difference1 = system.secondsFromGMT() - timezone1!.secondsFromGMT let difference1 = system.secondsFromGMT() - timezone1!.secondsFromGMT
let difference2 = system.secondsFromGMT() - timezone2!.secondsFromGMT let difference2 = system.secondsFromGMT() - timezone2!.secondsFromGMT

96
Clocker/Preferences/Preferences.storyboard

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="16097.2" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="RHq-9Z-auA"> <document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="17156" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="RHq-9Z-auA">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="16097.2"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17156"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
@ -781,7 +781,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9WW-jp-NeO"> <segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9WW-jp-NeO">
<rect key="frame" x="203" y="267" width="143" height="24"/> <rect key="frame" x="203" y="287" width="143" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="CcB-5w-IoG"> <segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="CcB-5w-IoG">
<font key="font" size="12" name="Avenir-Light"/> <font key="font" size="12" name="Avenir-Light"/>
<segments> <segments>
@ -795,7 +795,7 @@
</connections> </connections>
</segmentedControl> </segmentedControl>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gEH-vT-EqV"> <segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gEH-vT-EqV">
<rect key="frame" x="203" y="229" width="160" height="24"/> <rect key="frame" x="203" y="249" width="160" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="5Rz-xo-JB7"> <segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="5Rz-xo-JB7">
<font key="font" size="12" name="Avenir-Light"/> <font key="font" size="12" name="Avenir-Light"/>
<segments> <segments>
@ -809,7 +809,7 @@
</connections> </connections>
</segmentedControl> </segmentedControl>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="120" translatesAutoresizingMaskIntoConstraints="NO" id="xwt-pY-1w9"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="120" translatesAutoresizingMaskIntoConstraints="NO" id="xwt-pY-1w9">
<rect key="frame" x="30" y="194" width="152" height="18"/> <rect key="frame" x="30" y="176" width="152" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="148" id="7fj-Em-Lyh"/> <constraint firstAttribute="width" constant="148" id="7fj-Em-Lyh"/>
</constraints> </constraints>
@ -820,7 +820,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="150" translatesAutoresizingMaskIntoConstraints="NO" id="gFE-hZ-J92"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="150" translatesAutoresizingMaskIntoConstraints="NO" id="gFE-hZ-J92">
<rect key="frame" x="45" y="308" width="137" height="18"/> <rect key="frame" x="45" y="328" width="137" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="133" id="SCi-hT-hxG"/> <constraint firstAttribute="width" constant="133" id="SCi-hT-hxG"/>
</constraints> </constraints>
@ -831,7 +831,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="100" translatesAutoresizingMaskIntoConstraints="NO" id="wtO-uL-QBf"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="100" translatesAutoresizingMaskIntoConstraints="NO" id="wtO-uL-QBf">
<rect key="frame" x="78" y="384" width="104" height="18"/> <rect key="frame" x="78" y="404" width="104" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="100" id="WNN-Le-h1b"/> <constraint firstAttribute="width" constant="100" id="WNN-Le-h1b"/>
</constraints> </constraints>
@ -842,7 +842,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="d4S-hM-MSP"> <segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="d4S-hM-MSP">
<rect key="frame" x="203" y="305" width="292" height="24"/> <rect key="frame" x="203" y="325" width="292" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="564-Re-f1d"> <segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="564-Re-f1d">
<font key="font" size="12" name="Avenir-Light"/> <font key="font" size="12" name="Avenir-Light"/>
<segments> <segments>
@ -858,7 +858,7 @@
</connections> </connections>
</segmentedControl> </segmentedControl>
<segmentedControl toolTip="Select a time-format!" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="699-dn-eyN"> <segmentedControl toolTip="Select a time-format!" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="699-dn-eyN">
<rect key="frame" x="203" y="381" width="236" height="24"/> <rect key="frame" x="203" y="401" width="236" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="R6T-Ym-jpK"> <segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="R6T-Ym-jpK">
<font key="font" size="13" name="Avenir-Light"/> <font key="font" size="13" name="Avenir-Light"/>
<segments> <segments>
@ -872,7 +872,7 @@
</connections> </connections>
</segmentedControl> </segmentedControl>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="60" translatesAutoresizingMaskIntoConstraints="NO" id="vrm-cg-RMn"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="60" translatesAutoresizingMaskIntoConstraints="NO" id="vrm-cg-RMn">
<rect key="frame" x="81" y="346" width="101" height="18"/> <rect key="frame" x="81" y="366" width="101" height="18"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Panel Theme" id="ZKN-5V-B4D"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Panel Theme" id="ZKN-5V-B4D">
<font key="font" size="13" name="Avenir-Light"/> <font key="font" size="13" name="Avenir-Light"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -880,7 +880,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="8IA-JL-fje"> <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="8IA-JL-fje">
<rect key="frame" x="559" y="177" width="32" height="52"/> <rect key="frame" x="559" y="159" width="32" height="52"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="32" id="GZK-Zb-UYb"/> <constraint firstAttribute="width" constant="32" id="GZK-Zb-UYb"/>
<constraint firstAttribute="height" constant="52" id="SSv-hh-RFa"/> <constraint firstAttribute="height" constant="52" id="SSv-hh-RFa"/>
@ -888,7 +888,7 @@
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSFontPanel" id="yoa-s4-khY"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSFontPanel" id="yoa-s4-khY"/>
</imageView> </imageView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="120" translatesAutoresizingMaskIntoConstraints="NO" id="w0y-UQ-RC0"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="120" translatesAutoresizingMaskIntoConstraints="NO" id="w0y-UQ-RC0">
<rect key="frame" x="19" y="232" width="163" height="18"/> <rect key="frame" x="19" y="252" width="163" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="159" id="mNx-18-sdT"/> <constraint firstAttribute="width" constant="159" id="mNx-18-sdT"/>
</constraints> </constraints>
@ -898,8 +898,22 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="DCB-IB-UxK">
<rect key="frame" x="203" y="211" width="82" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="PZZ-H7-LgV">
<font key="font" size="12" name="Avenir-Light"/>
<segments>
<segment label="Yes"/>
<segment label="No" selected="YES" tag="1"/>
</segments>
</segmentedCell>
<connections>
<action selector="toggleDSTTransitionOption:" target="1aL-zR-8L4" id="9bi-NL-gMv"/>
<binding destination="Gpv-Gr-MxZ" name="selectedIndex" keyPath="values.com.abhishek.showDSTTransitionInfo" id="eG0-sL-5hE"/>
</connections>
</segmentedControl>
<segmentedControl toolTip="Choose a theme for the main panel!" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="FZb-fP-hMJ"> <segmentedControl toolTip="Choose a theme for the main panel!" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="FZb-fP-hMJ">
<rect key="frame" x="203" y="343" width="265" height="24"/> <rect key="frame" x="203" y="363" width="265" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="hcQ-xa-e2V"> <segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="hcQ-xa-e2V">
<font key="font" size="12" name="Avenir-Light"/> <font key="font" size="12" name="Avenir-Light"/>
<segments> <segments>
@ -914,7 +928,7 @@
</connections> </connections>
</segmentedControl> </segmentedControl>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="120" translatesAutoresizingMaskIntoConstraints="NO" id="4lt-X6-3uU"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="120" translatesAutoresizingMaskIntoConstraints="NO" id="4lt-X6-3uU">
<rect key="frame" x="38" y="270" width="144" height="18"/> <rect key="frame" x="38" y="290" width="144" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="140" id="hAp-By-Lzj"/> <constraint firstAttribute="width" constant="140" id="hAp-By-Lzj"/>
</constraints> </constraints>
@ -925,7 +939,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<slider verticalHuggingPriority="750" alphaValue="0.59999999999999998" translatesAutoresizingMaskIntoConstraints="NO" id="3cU-IS-3Qu"> <slider verticalHuggingPriority="750" alphaValue="0.59999999999999998" translatesAutoresizingMaskIntoConstraints="NO" id="3cU-IS-3Qu">
<rect key="frame" x="203" y="190" width="350" height="24"/> <rect key="frame" x="203" y="172" width="350" height="24"/>
<sliderCell key="cell" state="on" alignment="left" minValue="4" maxValue="7" doubleValue="4" tickMarkPosition="above" numberOfTickMarks="4" allowsTickMarkValuesOnly="YES" sliderType="linear" id="eAh-k3-cof"/> <sliderCell key="cell" state="on" alignment="left" minValue="4" maxValue="7" doubleValue="4" tickMarkPosition="above" numberOfTickMarks="4" allowsTickMarkValuesOnly="YES" sliderType="linear" id="eAh-k3-cof"/>
<connections> <connections>
<action selector="fontSliderChanged:" target="1aL-zR-8L4" id="YAW-aA-5aR"/> <action selector="fontSliderChanged:" target="1aL-zR-8L4" id="YAW-aA-5aR"/>
@ -933,7 +947,7 @@
</connections> </connections>
</slider> </slider>
<scrollView borderType="line" autohidesScrollers="YES" horizontalLineScroll="113" horizontalPageScroll="10" verticalLineScroll="113" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ytg-0u-Mtu"> <scrollView borderType="line" autohidesScrollers="YES" horizontalLineScroll="113" horizontalPageScroll="10" verticalLineScroll="113" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ytg-0u-Mtu">
<rect key="frame" x="104" y="40" width="400" height="100"/> <rect key="frame" x="104" y="42" width="400" height="100"/>
<clipView key="contentView" id="gnX-f5-31D"> <clipView key="contentView" id="gnX-f5-31D">
<rect key="frame" x="1" y="1" width="398" height="98"/> <rect key="frame" x="1" y="1" width="398" height="98"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@ -1110,7 +1124,7 @@
</scroller> </scroller>
</scrollView> </scrollView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ZNm-TN-RRJ"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ZNm-TN-RRJ">
<rect key="frame" x="248" y="150" width="112" height="22"/> <rect key="frame" x="248" y="147" width="112" height="22"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="108" id="KwL-So-Ymu"/> <constraint firstAttribute="width" constant="108" id="KwL-So-Ymu"/>
<constraint firstAttribute="height" constant="22" id="bBD-fJ-Xm7"/> <constraint firstAttribute="height" constant="22" id="bBD-fJ-Xm7"/>
@ -1121,27 +1135,41 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="120" translatesAutoresizingMaskIntoConstraints="NO" id="ZWy-WW-6H9">
<rect key="frame" x="19" y="214" width="163" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="159" id="NX0-Bo-SU8"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Show DST transition info" id="i0m-6h-scA">
<font key="font" size="13" name="Avenir-Light"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="4lt-X6-3uU" firstAttribute="trailing" secondItem="gFE-hZ-J92" secondAttribute="trailing" id="0LC-R1-cwL"/> <constraint firstItem="4lt-X6-3uU" firstAttribute="trailing" secondItem="gFE-hZ-J92" secondAttribute="trailing" id="0LC-R1-cwL"/>
<constraint firstItem="4lt-X6-3uU" firstAttribute="top" secondItem="gFE-hZ-J92" secondAttribute="bottom" constant="20" id="0zz-yr-dkd"/> <constraint firstItem="4lt-X6-3uU" firstAttribute="top" secondItem="gFE-hZ-J92" secondAttribute="bottom" constant="20" id="0zz-yr-dkd"/>
<constraint firstAttribute="trailing" secondItem="d4S-hM-MSP" secondAttribute="trailing" constant="115" id="6EI-oM-u6q"/> <constraint firstAttribute="trailing" secondItem="d4S-hM-MSP" secondAttribute="trailing" constant="115" id="6EI-oM-u6q"/>
<constraint firstItem="d4S-hM-MSP" firstAttribute="leading" secondItem="FZb-fP-hMJ" secondAttribute="leading" id="6GY-mg-50H"/> <constraint firstItem="d4S-hM-MSP" firstAttribute="leading" secondItem="FZb-fP-hMJ" secondAttribute="leading" id="6GY-mg-50H"/>
<constraint firstItem="ZWy-WW-6H9" firstAttribute="top" secondItem="w0y-UQ-RC0" secondAttribute="bottom" constant="20" id="725-Ob-eKH"/>
<constraint firstAttribute="trailing" secondItem="FZb-fP-hMJ" secondAttribute="trailing" constant="142" id="Dfr-Sc-kQB"/> <constraint firstAttribute="trailing" secondItem="FZb-fP-hMJ" secondAttribute="trailing" constant="142" id="Dfr-Sc-kQB"/>
<constraint firstItem="vrm-cg-RMn" firstAttribute="trailing" secondItem="wtO-uL-QBf" secondAttribute="trailing" id="Dz6-2y-0Kj"/> <constraint firstItem="vrm-cg-RMn" firstAttribute="trailing" secondItem="wtO-uL-QBf" secondAttribute="trailing" id="Dz6-2y-0Kj"/>
<constraint firstItem="vrm-cg-RMn" firstAttribute="top" secondItem="wtO-uL-QBf" secondAttribute="bottom" constant="20" id="E8U-ve-Yq8"/> <constraint firstItem="vrm-cg-RMn" firstAttribute="top" secondItem="wtO-uL-QBf" secondAttribute="bottom" constant="20" id="E8U-ve-Yq8"/>
<constraint firstItem="Ytg-0u-Mtu" firstAttribute="centerX" secondItem="zFb-Gb-3dB" secondAttribute="centerX" id="EHm-Kq-6Nq"/> <constraint firstItem="Ytg-0u-Mtu" firstAttribute="centerX" secondItem="zFb-Gb-3dB" secondAttribute="centerX" id="EHm-Kq-6Nq"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="699-dn-eyN" secondAttribute="trailing" constant="10" id="EdO-mM-G6w"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="699-dn-eyN" secondAttribute="trailing" constant="10" id="EdO-mM-G6w"/>
<constraint firstItem="ZNm-TN-RRJ" firstAttribute="top" secondItem="3cU-IS-3Qu" secondAttribute="bottom" constant="20" id="KJj-ji-SG9"/> <constraint firstItem="ZNm-TN-RRJ" firstAttribute="top" secondItem="3cU-IS-3Qu" secondAttribute="bottom" constant="5" id="KJj-ji-SG9"/>
<constraint firstItem="wtO-uL-QBf" firstAttribute="leading" secondItem="zFb-Gb-3dB" secondAttribute="leading" constant="80" id="KPc-a4-RWW"/> <constraint firstItem="wtO-uL-QBf" firstAttribute="leading" secondItem="zFb-Gb-3dB" secondAttribute="leading" constant="80" id="KPc-a4-RWW"/>
<constraint firstItem="d4S-hM-MSP" firstAttribute="centerY" secondItem="gFE-hZ-J92" secondAttribute="centerY" id="MB4-vU-XFQ"/> <constraint firstItem="d4S-hM-MSP" firstAttribute="centerY" secondItem="gFE-hZ-J92" secondAttribute="centerY" id="MB4-vU-XFQ"/>
<constraint firstItem="gEH-vT-EqV" firstAttribute="leading" secondItem="9WW-jp-NeO" secondAttribute="leading" id="NBM-n8-g9p"/> <constraint firstItem="gEH-vT-EqV" firstAttribute="leading" secondItem="9WW-jp-NeO" secondAttribute="leading" id="NBM-n8-g9p"/>
<constraint firstItem="9WW-jp-NeO" firstAttribute="leading" secondItem="d4S-hM-MSP" secondAttribute="leading" id="Nfi-6H-7VR"/> <constraint firstItem="9WW-jp-NeO" firstAttribute="leading" secondItem="d4S-hM-MSP" secondAttribute="leading" id="Nfi-6H-7VR"/>
<constraint firstItem="DCB-IB-UxK" firstAttribute="centerY" secondItem="ZWy-WW-6H9" secondAttribute="centerY" id="Ob9-nz-HhX"/>
<constraint firstItem="8IA-JL-fje" firstAttribute="centerY" secondItem="3cU-IS-3Qu" secondAttribute="centerY" id="QZn-RJ-b2s"/> <constraint firstItem="8IA-JL-fje" firstAttribute="centerY" secondItem="3cU-IS-3Qu" secondAttribute="centerY" id="QZn-RJ-b2s"/>
<constraint firstItem="wtO-uL-QBf" firstAttribute="top" secondItem="zFb-Gb-3dB" secondAttribute="top" constant="30" id="TUd-Wc-XZL"/> <constraint firstItem="wtO-uL-QBf" firstAttribute="top" secondItem="zFb-Gb-3dB" secondAttribute="top" constant="10" id="TUd-Wc-XZL"/>
<constraint firstItem="w0y-UQ-RC0" firstAttribute="top" secondItem="4lt-X6-3uU" secondAttribute="bottom" constant="20" id="ULM-L5-4EP"/> <constraint firstItem="w0y-UQ-RC0" firstAttribute="top" secondItem="4lt-X6-3uU" secondAttribute="bottom" constant="20" id="ULM-L5-4EP"/>
<constraint firstItem="vrm-cg-RMn" firstAttribute="width" secondItem="wtO-uL-QBf" secondAttribute="width" multiplier="0.97" id="W8Z-wH-RJT"/> <constraint firstItem="vrm-cg-RMn" firstAttribute="width" secondItem="wtO-uL-QBf" secondAttribute="width" multiplier="0.97" id="W8Z-wH-RJT"/>
<constraint firstAttribute="trailing" secondItem="8IA-JL-fje" secondAttribute="trailing" constant="17" id="XEc-lD-5Pt"/> <constraint firstAttribute="trailing" secondItem="8IA-JL-fje" secondAttribute="trailing" constant="17" id="XEc-lD-5Pt"/>
<constraint firstItem="xwt-pY-1w9" firstAttribute="top" secondItem="ZWy-WW-6H9" secondAttribute="bottom" constant="20" id="bFw-FZ-dB7"/>
<constraint firstItem="ZNm-TN-RRJ" firstAttribute="centerX" secondItem="zFb-Gb-3dB" secondAttribute="centerX" id="bWQ-fX-DZe"/> <constraint firstItem="ZNm-TN-RRJ" firstAttribute="centerX" secondItem="zFb-Gb-3dB" secondAttribute="centerX" id="bWQ-fX-DZe"/>
<constraint firstItem="699-dn-eyN" firstAttribute="centerY" secondItem="wtO-uL-QBf" secondAttribute="centerY" id="bfw-Ln-spi"/> <constraint firstItem="699-dn-eyN" firstAttribute="centerY" secondItem="wtO-uL-QBf" secondAttribute="centerY" id="bfw-Ln-spi"/>
<constraint firstItem="3cU-IS-3Qu" firstAttribute="leading" secondItem="gEH-vT-EqV" secondAttribute="leading" id="dwP-Gf-Jak"/> <constraint firstItem="3cU-IS-3Qu" firstAttribute="leading" secondItem="gEH-vT-EqV" secondAttribute="leading" id="dwP-Gf-Jak"/>
@ -1149,11 +1177,12 @@
<constraint firstItem="xwt-pY-1w9" firstAttribute="trailing" secondItem="w0y-UQ-RC0" secondAttribute="trailing" id="hi7-BQ-ZDh"/> <constraint firstItem="xwt-pY-1w9" firstAttribute="trailing" secondItem="w0y-UQ-RC0" secondAttribute="trailing" id="hi7-BQ-ZDh"/>
<constraint firstItem="gFE-hZ-J92" firstAttribute="top" secondItem="vrm-cg-RMn" secondAttribute="bottom" constant="20" id="ijE-Xu-svg"/> <constraint firstItem="gFE-hZ-J92" firstAttribute="top" secondItem="vrm-cg-RMn" secondAttribute="bottom" constant="20" id="ijE-Xu-svg"/>
<constraint firstAttribute="trailing" secondItem="gEH-vT-EqV" secondAttribute="trailing" constant="247" id="jQj-Gf-XPT"/> <constraint firstAttribute="trailing" secondItem="gEH-vT-EqV" secondAttribute="trailing" constant="247" id="jQj-Gf-XPT"/>
<constraint firstItem="xwt-pY-1w9" firstAttribute="top" secondItem="w0y-UQ-RC0" secondAttribute="bottom" constant="20" id="krm-S3-2y5"/>
<constraint firstItem="699-dn-eyN" firstAttribute="leading" secondItem="wtO-uL-QBf" secondAttribute="trailing" constant="25" id="nM0-Kn-lTZ"/> <constraint firstItem="699-dn-eyN" firstAttribute="leading" secondItem="wtO-uL-QBf" secondAttribute="trailing" constant="25" id="nM0-Kn-lTZ"/>
<constraint firstItem="3cU-IS-3Qu" firstAttribute="centerY" secondItem="xwt-pY-1w9" secondAttribute="centerY" id="oM8-iJ-okk"/> <constraint firstItem="3cU-IS-3Qu" firstAttribute="centerY" secondItem="xwt-pY-1w9" secondAttribute="centerY" id="oM8-iJ-okk"/>
<constraint firstItem="9WW-jp-NeO" firstAttribute="centerY" secondItem="4lt-X6-3uU" secondAttribute="centerY" id="oPk-1s-bdu"/> <constraint firstItem="9WW-jp-NeO" firstAttribute="centerY" secondItem="4lt-X6-3uU" secondAttribute="centerY" id="oPk-1s-bdu"/>
<constraint firstItem="Ytg-0u-Mtu" firstAttribute="top" secondItem="ZNm-TN-RRJ" secondAttribute="bottom" constant="10" id="ouW-SE-Jmn"/> <constraint firstItem="DCB-IB-UxK" firstAttribute="leading" secondItem="gEH-vT-EqV" secondAttribute="leading" id="odB-k0-PQW"/>
<constraint firstItem="Ytg-0u-Mtu" firstAttribute="top" secondItem="ZNm-TN-RRJ" secondAttribute="bottom" constant="5" id="ouW-SE-Jmn"/>
<constraint firstItem="ZWy-WW-6H9" firstAttribute="trailing" secondItem="w0y-UQ-RC0" secondAttribute="trailing" id="qxM-Ei-4zi"/>
<constraint firstItem="FZb-fP-hMJ" firstAttribute="leading" secondItem="699-dn-eyN" secondAttribute="leading" id="rCV-e3-pae"/> <constraint firstItem="FZb-fP-hMJ" firstAttribute="leading" secondItem="699-dn-eyN" secondAttribute="leading" id="rCV-e3-pae"/>
<constraint firstAttribute="trailing" secondItem="9WW-jp-NeO" secondAttribute="trailing" constant="264" id="s9R-1X-ZOO"/> <constraint firstAttribute="trailing" secondItem="9WW-jp-NeO" secondAttribute="trailing" constant="264" id="s9R-1X-ZOO"/>
<constraint firstItem="w0y-UQ-RC0" firstAttribute="trailing" secondItem="4lt-X6-3uU" secondAttribute="trailing" id="ubu-xP-pha"/> <constraint firstItem="w0y-UQ-RC0" firstAttribute="trailing" secondItem="4lt-X6-3uU" secondAttribute="trailing" id="ubu-xP-pha"/>
@ -1493,7 +1522,7 @@
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<searchField toolTip="Search a timezone" wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Dha-h9-Nd0" customClass="ClockerSearchField" customModule="Clocker" customModuleProvider="target"> <searchField toolTip="Search a timezone" wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Dha-h9-Nd0" customClass="ClockerSearchField" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="8" y="97" width="329" height="23"/> <rect key="frame" x="8" y="49" width="329" height="23"/>
<searchFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" borderStyle="bezel" focusRingType="none" placeholderString="Enter a city, state, country name" usesSingleLineMode="YES" maximumRecents="5" id="ikU-Tm-0WZ"> <searchFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" borderStyle="bezel" focusRingType="none" placeholderString="Enter a city, state, country name" usesSingleLineMode="YES" maximumRecents="5" id="ikU-Tm-0WZ">
<font key="font" size="13" name="Avenir-Light"/> <font key="font" size="13" name="Avenir-Light"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@ -1550,13 +1579,13 @@ DQ
</connections> </connections>
</button> </button>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="32" horizontalPageScroll="10" verticalLineScroll="32" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0wY-ff-FLW"> <scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="32" horizontalPageScroll="10" verticalLineScroll="32" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0wY-ff-FLW">
<rect key="frame" x="8" y="30" width="329" height="57"/> <rect key="frame" x="8" y="30" width="329" height="9"/>
<clipView key="contentView" drawsBackground="NO" id="rGc-3M-cCq"> <clipView key="contentView" drawsBackground="NO" id="rGc-3M-cCq">
<rect key="frame" x="0.0" y="0.0" width="329" height="57"/> <rect key="frame" x="0.0" y="0.0" width="329" height="9"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" rowHeight="30" rowSizeStyle="automatic" viewBased="YES" id="xkl-2X-ZCb"> <tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" rowHeight="30" rowSizeStyle="automatic" viewBased="YES" id="xkl-2X-ZCb">
<rect key="frame" x="0.0" y="0.0" width="329" height="57"/> <rect key="frame" x="0.0" y="0.0" width="329" height="9"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/> <size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
@ -1646,14 +1675,14 @@ DQ
</scroller> </scroller>
</scrollView> </scrollView>
<progressIndicator wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="0A5-gp-lay"> <progressIndicator wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="0A5-gp-lay">
<rect key="frame" x="165" y="78" width="16" height="16"/> <rect key="frame" x="165" y="54" width="16" height="16"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="16" id="fgE-77-Vda"/> <constraint firstAttribute="height" constant="16" id="fgE-77-Vda"/>
<constraint firstAttribute="width" constant="16" id="pwe-em-e0a"/> <constraint firstAttribute="width" constant="16" id="pwe-em-e0a"/>
</constraints> </constraints>
</progressIndicator> </progressIndicator>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xgb-wU-8RU"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xgb-wU-8RU">
<rect key="frame" x="18" y="48" width="309" height="22"/> <rect key="frame" x="18" y="24" width="309" height="22"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="22" id="zqt-d8-yas"/> <constraint firstAttribute="height" constant="22" id="zqt-d8-yas"/>
</constraints> </constraints>
@ -1701,7 +1730,7 @@ DQ
<rect key="frame" x="0.0" y="484" width="613" height="30"/> <rect key="frame" x="0.0" y="484" width="613" height="30"/>
<subviews> <subviews>
<button toolTip="Sorts by time difference from your current timezone" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="P6d-qq-ycq"> <button toolTip="Sorts by time difference from your current timezone" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="P6d-qq-ycq">
<rect key="frame" x="277" y="3" width="13" height="25"/> <rect key="frame" x="279" y="3" width="12" height="25"/>
<constraints> <constraints>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="160" id="cAs-on-f7X"/> <constraint firstAttribute="width" relation="lessThanOrEqual" constant="160" id="cAs-on-f7X"/>
<constraint firstAttribute="height" constant="25" id="juv-QL-vMx"/> <constraint firstAttribute="height" constant="25" id="juv-QL-vMx"/>
@ -1716,7 +1745,7 @@ DQ
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0HL-uj-s4v"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0HL-uj-s4v">
<rect key="frame" x="333" y="3" width="13" height="25"/> <rect key="frame" x="333" y="3" width="12" height="25"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="25" id="eZL-Gr-38S"/> <constraint firstAttribute="height" constant="25" id="eZL-Gr-38S"/>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="120" id="sJk-T7-7Lm"/> <constraint firstAttribute="width" relation="lessThanOrEqual" constant="120" id="sJk-T7-7Lm"/>
@ -1731,7 +1760,7 @@ DQ
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6fs-Mx-NcG"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6fs-Mx-NcG">
<rect key="frame" x="305" y="3" width="13" height="25"/> <rect key="frame" x="306" y="3" width="12" height="25"/>
<constraints> <constraints>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="190" id="241-Rn-G6N"/> <constraint firstAttribute="width" relation="lessThanOrEqual" constant="190" id="241-Rn-G6N"/>
<constraint firstAttribute="height" constant="25" id="weP-ll-vZ8"/> <constraint firstAttribute="height" constant="25" id="weP-ll-vZ8"/>
@ -1973,6 +2002,11 @@ CA
<point key="canvasLocation" x="747" y="1244"/> <point key="canvasLocation" x="747" y="1244"/>
</scene> </scene>
</scenes> </scenes>
<designables>
<designable name="PbD-dt-goz">
<size key="intrinsicContentSize" width="96" height="25"/>
</designable>
</designables>
<resources> <resources>
<image name="Add Icon" width="700" height="700"/> <image name="Add Icon" width="700" height="700"/>
<image name="Appearance Dynamic" width="350" height="350"/> <image name="Appearance Dynamic" width="350" height="350"/>
@ -1980,7 +2014,7 @@ CA
<image name="ClockerIcon-512" width="1024" height="1024"/> <image name="ClockerIcon-512" width="1024" height="1024"/>
<image name="CurrentLocation" width="350" height="350"/> <image name="CurrentLocation" width="350" height="350"/>
<image name="Extra" width="700" height="700"/> <image name="Extra" width="700" height="700"/>
<image name="NSDescendingSortIndicator" width="9" height="9"/> <image name="NSDescendingSortIndicator" width="8" height="8"/>
<image name="NSFontPanel" width="32" height="32"/> <image name="NSFontPanel" width="32" height="32"/>
<image name="NSInfo" width="32" height="32"/> <image name="NSInfo" width="32" height="32"/>
<image name="NSPreferencesGeneral" width="32" height="32"/> <image name="NSPreferencesGeneral" width="32" height="32"/>

Loading…
Cancel
Save