Abhishek Banthia 1 year ago
parent
commit
12ca3bdb1b
  1. 2
      Clocker/AppDelegate.swift
  2. 2
      Clocker/Clocker/Clocker-Info.plist
  3. 11
      Clocker/Clocker/LocationController.swift
  4. 2
      Clocker/Clocker/ar.lproj/Localizable.strings
  5. 4
      Clocker/Clocker/ca.lproj/Localizable.strings
  6. 2
      Clocker/Clocker/de.lproj/Localizable.strings
  7. 4
      Clocker/Clocker/en.lproj/Localizable.strings
  8. 109
      Clocker/Clocker/en.lproj/Panel.xib
  9. 2
      Clocker/Clocker/es.lproj/Localizable.strings
  10. 2
      Clocker/Clocker/fr.lproj/Localizable.strings
  11. 2
      Clocker/Clocker/hi.lproj/Localizable.strings
  12. 2
      Clocker/Clocker/hr.lproj/Localizable.strings
  13. 4
      Clocker/Clocker/it.lproj/Localizable.strings
  14. 2
      Clocker/Clocker/ja.lproj/Localizable.strings
  15. 2
      Clocker/Clocker/ko.lproj/Localizable.strings
  16. 4
      Clocker/Clocker/nl.lproj/Localizable.strings
  17. 4
      Clocker/Clocker/pl.lproj/Localizable.strings
  18. 2
      Clocker/Clocker/pt-BR.lproj/Localizable.strings
  19. 2
      Clocker/Clocker/ru.lproj/Localizable.strings
  20. 2
      Clocker/Clocker/tr.lproj/Localizable.strings
  21. 4
      Clocker/Clocker/uk.lproj/Localizable.strings
  22. 2
      Clocker/Clocker/zh-Hans.lproj/Localizable.strings
  23. 2
      Clocker/Clocker/zh-Hant.lproj/Localizable.strings
  24. 9
      Clocker/ClockerUITests/CopyToClipboardTests.swift
  25. 10
      Clocker/ClockerUnitTests/AppDelegateTests.swift
  26. 8
      Clocker/ClockerUnitTests/ClockerUnitTests.swift
  27. 4
      Clocker/ClockerUnitTests/SearchDataSourceTests.swift
  28. 4
      Clocker/ClockerUnitTests/StandardMenubarHandlerTests.swift
  29. 14
      Clocker/CoreModelKit/Sources/CoreModelKit/TimezoneData.swift
  30. 2
      Clocker/Events and Reminders/CalendarHandler.swift
  31. 24
      Clocker/Onboarding/Onboarding.storyboard
  32. 40
      Clocker/Onboarding/OnboardingPermissionsViewController.swift
  33. 2
      Clocker/Onboarding/OnboardingSearchController.swift
  34. 3
      Clocker/Overall App/AppDefaults.swift
  35. 4
      Clocker/Overall App/DataStore.swift
  36. 15
      Clocker/Overall App/Foundation + Additions.swift
  37. 16
      Clocker/Overall App/Themer.swift
  38. 4
      Clocker/Panel/Data Layer/TimezoneDataOperations.swift
  39. 9
      Clocker/Panel/Notes Popover/NotesPopover.swift
  40. 2
      Clocker/Panel/PanelController.swift
  41. 15
      Clocker/Panel/ParentPanelController.swift
  42. 26
      Clocker/Panel/UI/FloatingWindow.xib
  43. 3
      Clocker/Panel/UI/PanelTableView.swift
  44. 2
      Clocker/Panel/UI/TimezoneDataSource.swift
  45. 1
      Clocker/Panel/Upcoming Events/ParentPanelController+UpcomingEvents.swift
  46. 2
      Clocker/Panel/Upcoming Events/UpcomingEventsDataSource.swift
  47. 6
      Clocker/Preferences/General/PreferencesDataSource.swift
  48. 6
      Clocker/Preferences/General/PreferencesViewController.swift
  49. 29
      Clocker/Preferences/Menu Bar/StatusContainerView.swift
  50. 13
      Clocker/Preferences/Menu Bar/StatusItemView.swift
  51. 2
      Clocker/Preferences/Menu Bar/UpcomingEventStatusItemView.swift
  52. 42
      Clocker/Preferences/Preferences.storyboard

2
Clocker/AppDelegate.swift

@ -66,7 +66,7 @@ open class AppDelegate: NSObject, NSApplicationDelegate {
let menu = NSMenu(title: "Quick Access")
let toggleMenuItem = NSMenuItem(title: "Toggle Panel", action: #selector(AppDelegate.togglePanel(_:)), keyEquivalent: "")
let openPreferences = NSMenuItem(title: "Preferences", action: #selector(AppDelegate.openPreferencesWindow), keyEquivalent: ",")
let openPreferences = NSMenuItem(title: "Settings", action: #selector(AppDelegate.openPreferencesWindow), keyEquivalent: ",")
let hideFromDockMenuItem = NSMenuItem(title: "Hide from Dock", action: #selector(AppDelegate.hideFromDock), keyEquivalent: "")
[toggleMenuItem, openPreferences, hideFromDockMenuItem].forEach {

2
Clocker/Clocker/Clocker-Info.plist

@ -47,5 +47,7 @@
<true/>
<key>RequestsOpenAccess</key>
<string>YES</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
</dict>
</plist>

11
Clocker/Clocker/LocationController.swift

@ -5,9 +5,13 @@ import CoreLocation
import CoreLoggerKit
import CoreModelKit
protocol LocationControllerDelegate: NSObject {
func didChangeAuthorizationStatus()
}
class LocationController: NSObject {
private let store: DataStore
init(withStore dataStore: DataStore) {
store = dataStore
super.init()
@ -28,6 +32,7 @@ class LocationController: NSObject {
}
func locationAccessGranted() -> Bool {
print("Location Status is ", CLLocationManager.authorizationStatus().rawValue.description)
return CLLocationManager.authorizationStatus() == .authorizedAlways || CLLocationManager.authorizationStatus() == .authorized
}
@ -80,7 +85,9 @@ class LocationController: NSObject {
var datas: [Data] = []
for updatedObject in timezoneObjects {
let dataObject = NSKeyedArchiver.archivedData(withRootObject: updatedObject)
guard let dataObject = NSKeyedArchiver.clocker_archive(with: updatedObject) else {
continue
}
datas.append(dataObject)
}

2
Clocker/Clocker/ar.lproj/Localizable.strings

@ -75,7 +75,7 @@
/* Text for button that takes the user to the System Preferences app. In case the user hasn't given Calendar/Reminders access permission, this button takes you to the System Preferences app where the user can give proper permissions to Clocker. */
"Launch Preferences" = "الانتقال إلى تفضيلات النظام";
"Grant Access" = "منح صلاحية الوصول";
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "الأحداث القادمة من تقويماتك الشخصية والمشتركة يمكن أن تظهر في شريط القائمة ولوحة التحكم.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "الأحداث القادمة من تقويماتك الشخصية والمشتركة يمكن أن تظهر في شريط القائمة ولوحة التحكم.";
"Granted" = "سماح";
"Denied" = "رفض";
"Grant" = "منح";

4
Clocker/Clocker/ca.lproj/Localizable.strings

@ -26,7 +26,7 @@
"Reminders Access" = "Reminders Access";
"Calendar Access" = "Calendar Access";
"Permissions" = "Permissions";
"Calendar Detail" = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"Calendar Detail" = "Upcoming events from your calendars can be shown in the menubar + panel.";
"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.";
"Granted Button Text" = "Granted";
@ -74,7 +74,7 @@
"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.";
"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." = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Upcoming events from your calendars can be shown in the menubar + panel.";
"Granted" = "Granted";
"Denied" = "Denied";
"Grant" = "Grant";

2
Clocker/Clocker/de.lproj/Localizable.strings

@ -74,7 +74,7 @@
"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.";
"Launch Preferences" = "Einstellungen öffnen";
"Grant Access" = "Zugriff erlauben";
"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.";
"Upcoming events from your calendars can be shown in the menubar + 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";
"Grant" = "Gewähren";

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

@ -26,7 +26,7 @@
"Reminders Access" = "Reminders Access";
"Calendar Access" = "Calendar Access";
"Permissions" = "Permissions";
"Calendar Detail" = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"Calendar Detail" = "Upcoming events from your calendars can be shown in the menubar + panel.";
"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.";
"Granted Button Text" = "Granted";
@ -74,7 +74,7 @@
"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.";
"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." = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Upcoming events from your calendars can be shown in the menubar and the panel.";
"Granted" = "Granted";
"Denied" = "Denied";
"Grant" = "Grant";

109
Clocker/Clocker/en.lproj/Panel.xib

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17701"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
@ -42,23 +42,23 @@
<windowStyleMask key="styleMask" utility="YES" nonactivatingPanel="YES" texturedBackground="YES"/>
<windowCollectionBehavior key="collectionBehavior" moveToActiveSpace="YES" ignoresCycle="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="1000" y="379" width="350" height="460"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
<view key="contentView" focusRingType="none" id="6" customClass="BackgroundPanelView" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="370" height="450"/>
<rect key="contentRect" x="1000" y="379" width="300" height="420"/>
<rect key="screenRect" x="0.0" y="0.0" width="1280" height="777"/>
<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="300" height="420"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<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">
<rect key="frame" x="0.0" y="0.0" width="370" height="450"/>
<rect key="frame" x="0.0" y="0.0" width="379" height="450"/>
<subviews>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="96" horizontalPageScroll="1" verticalLineScroll="96" verticalPageScroll="1" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" scrollerKnobStyle="light" translatesAutoresizingMaskIntoConstraints="NO" id="4Gd-Nv-fXr">
<rect key="frame" x="0.0" y="185" width="370" height="265"/>
<rect key="frame" x="0.0" y="185" width="379" height="265"/>
<clipView key="contentView" focusRingType="none" drawsBackground="NO" copiesOnScroll="NO" id="4MZ-Di-yNR">
<rect key="frame" x="0.0" y="0.0" width="370" height="265"/>
<rect key="frame" x="0.0" y="0.0" width="379" height="265"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" rowHeight="95" viewBased="YES" id="dFw-ts-8OZ" customClass="PanelTableView" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="370" height="265"/>
<rect key="frame" x="0.0" y="0.0" width="379" height="265"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="1"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
@ -77,11 +77,11 @@
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView identifier="timeZoneCell" id="qbN-ba-fho" customClass="TimezoneCellView" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="11" y="0.0" width="347" height="111"/>
<rect key="frame" x="1" y="0.0" width="338" height="111"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" verticalCompressionResistancePriority="749" tag="102" preferredMaxLayoutWidth="72" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QUd-7D-q14">
<rect key="frame" x="28" y="50" width="189" height="22"/>
<rect key="frame" x="28" y="50" width="180" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" identifier="relative-day-height" id="JkG-8f-zhJ"/>
</constraints>
@ -92,7 +92,7 @@
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" tag="101" preferredMaxLayoutWidth="110" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vnv-J2-7r1">
<rect key="frame" x="215" y="67" width="114" height="35"/>
<rect key="frame" x="206" y="67" width="114" height="35"/>
<constraints>
<constraint firstAttribute="height" constant="35" identifier="height" id="Bwf-I6-2Pc"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="110" id="cQV-gJ-zMz"/>
@ -104,7 +104,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" preferredMaxLayoutWidth="50" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uOg-ij-alO">
<rect key="frame" x="245" y="49" width="84" height="20"/>
<rect key="frame" x="236" y="49" width="84" height="20"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="89H-r0-Dnh"/>
<constraint firstAttribute="width" constant="80" identifier="width" id="8KH-Ks-d4T"/>
@ -116,7 +116,7 @@
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6At-J8-gzZ">
<rect key="frame" x="28" y="0.0" width="319" height="22"/>
<rect key="frame" x="28" y="0.0" width="310" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="eYP-TP-f1a"/>
</constraints>
@ -127,7 +127,7 @@
</textFieldCell>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="sML-fJ-nbv">
<rect key="frame" x="225" y="49" width="20" height="20"/>
<rect key="frame" x="216" y="49" width="20" height="20"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="2NE-mf-cN5"/>
<constraint firstAttribute="width" constant="20" id="EXa-Tf-sR6"/>
@ -135,7 +135,7 @@
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageAlignment="right" imageScaling="proportionallyDown" id="cfP-C4-ENJ"/>
</imageView>
<textField verticalHuggingPriority="751" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" tag="100" preferredMaxLayoutWidth="150" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="etF-33-bCB">
<rect key="frame" x="28" y="79" width="181" height="20"/>
<rect key="frame" x="28" y="79" width="172" height="20"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" placeholderString="Timezone Name" id="rnh-AP-ooc">
<font key="font" size="15" name="Avenir-Medium"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@ -159,9 +159,9 @@
<constraint firstAttribute="height" constant="35" id="KT8-zo-Jox"/>
<constraint firstAttribute="width" constant="30" id="YCy-Bh-1Ik"/>
</constraints>
<buttonCell key="cell" type="bevel" bezelStyle="rounded" image="Extra" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="cSd-0p-P5N">
<buttonCell key="cell" type="bevel" bezelStyle="rounded" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="cSd-0p-P5N">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" metaFont="system"/>
<font key="font" metaFont="systemBold"/>
</buttonCell>
<connections>
<action selector="showExtraOptions:" target="qbN-ba-fho" id="IRR-6f-iwZ"/>
@ -213,11 +213,11 @@
</connections>
</tableCellView>
<tableCellView identifier="addCell" id="rb3-TW-xSb" customClass="AddTableViewCell" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="11" y="112" width="347" height="100"/>
<rect key="frame" x="1" y="112" width="338" height="100"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="AzA-5G-LR7">
<rect key="frame" x="134" y="10" width="80" height="80"/>
<rect key="frame" x="129" y="10" width="80" height="80"/>
<constraints>
<constraint firstAttribute="height" constant="80" id="bRv-Of-5l3"/>
<constraint firstAttribute="width" constant="80" id="cRC-Fx-WLR"/>
@ -262,10 +262,10 @@
</scroller>
</scrollView>
<customView wantsLayer="YES" focusRingType="none" translatesAutoresizingMaskIntoConstraints="NO" id="C7R-Dq-MFr" userLabel="Slider View">
<rect key="frame" x="0.0" y="245" width="350" height="30"/>
<rect key="frame" x="0.0" y="155" width="350" height="30"/>
<subviews>
<slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Vf2-uI-yf3">
<rect key="frame" x="7" y="2" width="201" height="23"/>
<rect key="frame" x="7" y="6" width="201" height="19"/>
<constraints>
<constraint firstAttribute="height" constant="15" id="cS7-i2-mHU"/>
</constraints>
@ -315,13 +315,13 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<scrollView wantsLayer="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasVerticalScroller="NO" horizontalScrollElasticity="allowed" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="htc-pO-AqH">
<rect key="frame" x="0.0" y="30" width="350" height="40"/>
<rect key="frame" x="0.0" y="25" width="350" height="45"/>
<clipView key="contentView" drawsBackground="NO" id="N1e-zE-F86" customClass="DraggableClipView" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="350" height="40"/>
<rect key="frame" x="0.0" y="0.0" width="350" height="45"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<collectionView focusRingType="none" allowsEmptySelection="NO" id="lxA-64-3QU">
<rect key="frame" x="0.0" y="0.0" width="350" height="40"/>
<rect key="frame" x="0.0" y="0.0" width="350" height="45"/>
<autoresizingMask key="autoresizingMask" heightSizable="YES"/>
<collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" id="mgM-vQ-fB7">
<size key="itemSize" width="10" height="50"/>
@ -345,7 +345,7 @@
</scroller>
</scrollView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="hma-wI-Sc9" userLabel="Modern Slider Metadata View" customClass="ClockerTextBackgroundView" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="125" y="0.0" width="100" height="20"/>
<rect key="frame" x="125" y="3" width="100" height="20"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="e2d-EI-Dm0">
<rect key="frame" x="-2" y="0.0" width="104" height="20"/>
@ -366,7 +366,7 @@
</constraints>
</customView>
<button wantsLayer="YES" translatesAutoresizingMaskIntoConstraints="NO" id="TK5-db-7bd">
<rect key="frame" x="215" y="15" width="15" height="15"/>
<rect key="frame" x="215" y="18" width="15" height="15"/>
<constraints>
<constraint firstAttribute="width" constant="15" id="JkE-Dc-CMn"/>
<constraint firstAttribute="height" constant="15" id="U52-GS-JMp"/>
@ -380,7 +380,7 @@
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="aW8-hr-4Zh">
<rect key="frame" x="75" y="0.0" width="45" height="20"/>
<rect key="frame" x="75" y="3" width="45" height="20"/>
<constraints>
<constraint firstAttribute="width" constant="45" id="2Ef-45-5pI"/>
<constraint firstAttribute="height" constant="20" id="Cgv-Fx-BfO"/>
@ -395,7 +395,7 @@
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Bmz-Z2-OvH">
<rect key="frame" x="230" y="0.0" width="45" height="20"/>
<rect key="frame" x="230" y="3" width="45" height="20"/>
<constraints>
<constraint firstAttribute="width" constant="45" id="ZOn-jQ-Wdp"/>
<constraint firstAttribute="height" constant="20" id="gfg-y1-zD1"/>
@ -419,8 +419,8 @@
<constraint firstItem="htc-pO-AqH" firstAttribute="top" secondItem="8W7-rS-Uob" secondAttribute="top" id="Ag8-2G-tVA"/>
<constraint firstItem="hma-wI-Sc9" firstAttribute="centerX" secondItem="8W7-rS-Uob" secondAttribute="centerX" id="GGe-go-nVx"/>
<constraint firstItem="htc-pO-AqH" firstAttribute="leading" secondItem="8W7-rS-Uob" secondAttribute="leading" id="QmJ-Dd-WLb"/>
<constraint firstAttribute="bottom" secondItem="hma-wI-Sc9" secondAttribute="bottom" id="TDr-Pa-iYA"/>
<constraint firstAttribute="bottom" secondItem="htc-pO-AqH" secondAttribute="bottom" priority="750" constant="30" id="YCJ-zB-dvc"/>
<constraint firstAttribute="bottom" secondItem="hma-wI-Sc9" secondAttribute="bottom" constant="3" id="TDr-Pa-iYA"/>
<constraint firstAttribute="bottom" secondItem="htc-pO-AqH" secondAttribute="bottom" priority="750" constant="25" id="YCJ-zB-dvc"/>
<constraint firstAttribute="trailing" secondItem="htc-pO-AqH" secondAttribute="trailing" id="esR-My-uoD"/>
<constraint firstItem="hma-wI-Sc9" firstAttribute="top" secondItem="TK5-db-7bd" secondAttribute="bottom" constant="-5" id="pIb-qt-jKw"/>
<constraint firstItem="TK5-db-7bd" firstAttribute="trailing" secondItem="hma-wI-Sc9" secondAttribute="trailing" constant="5" id="yhv-uP-Oih"/>
@ -428,13 +428,13 @@
<accessibility identifier="Modern Slider Container"/>
</customView>
<customView identifier="Review Cell" focusRingType="none" translatesAutoresizingMaskIntoConstraints="NO" id="TDn-Kk-KkV" userLabel="Review View">
<rect key="frame" x="0.0" y="115" width="370" height="60"/>
<rect key="frame" x="0.0" y="115" width="379" height="60"/>
<subviews>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="56t-G6-K0e" customClass="ClockerTextBackgroundView" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="10" y="5" width="348" height="50"/>
<rect key="frame" x="10" y="5" width="357" height="50"/>
<subviews>
<stackView focusRingType="none" distribution="fill" orientation="horizontal" alignment="centerY" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uys-ww-duA">
<rect key="frame" x="24" y="25" width="300" height="20"/>
<rect key="frame" x="29" y="25" width="300" height="20"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsExpansionToolTips="YES" preferredMaxLayoutWidth="185" translatesAutoresizingMaskIntoConstraints="NO" id="8Qj-Y9-Okf">
<rect key="frame" x="-2" y="0.0" width="304" height="20"/>
@ -458,10 +458,10 @@
<accessibility identifier="ReviewLabel"/>
</stackView>
<stackView focusRingType="none" distribution="fillEqually" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1AK-MW-qsc">
<rect key="frame" x="74" y="2" width="200" height="21"/>
<rect key="frame" x="79" y="2" width="200" height="21"/>
<subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="WVY-D9-AAX">
<rect key="frame" x="-7" y="-7" width="110" height="33"/>
<rect key="frame" x="-6" y="-7" width="108" height="32"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="4zI-xY-iLf"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="96" id="weK-At-NNy"/>
@ -475,7 +475,7 @@
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="w3d-CG-aBO">
<rect key="frame" x="97" y="-6" width="110" height="32"/>
<rect key="frame" x="98" y="-7" width="108" height="32"/>
<buttonCell key="cell" type="push" title="Yes!" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="VE1-Cu-JUr">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@ -513,16 +513,16 @@
<accessibility description="ReviewCell" identifier="ReviewCell"/>
</customView>
<customView wantsLayer="YES" focusRingType="none" translatesAutoresizingMaskIntoConstraints="NO" id="Akn-cR-W4G" userLabel="Upcoming Event View">
<rect key="frame" x="0.0" y="40" width="370" height="75"/>
<rect key="frame" x="0.0" y="40" width="379" height="75"/>
<subviews>
<scrollView wantsLayer="YES" focusRingType="none" borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5BT-DM-xru">
<rect key="frame" x="0.0" y="0.0" width="370" height="75"/>
<scrollView wantsLayer="YES" focusRingType="none" borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5BT-DM-xru">
<rect key="frame" x="0.0" y="0.0" width="379" height="75"/>
<clipView key="contentView" drawsBackground="NO" id="QHw-sR-BYe">
<rect key="frame" x="0.0" y="0.0" width="370" height="75"/>
<rect key="frame" x="0.0" y="0.0" width="379" height="75"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<collectionView id="Tp2-pl-yIm">
<rect key="frame" x="0.0" y="0.0" width="370" height="75"/>
<rect key="frame" x="0.0" y="0.0" width="379" height="75"/>
<autoresizingMask key="autoresizingMask" heightSizable="YES"/>
<collectionViewFlowLayout key="collectionViewLayout" minimumInteritemSpacing="10" minimumLineSpacing="10" scrollDirection="horizontal" id="g4p-GT-v9Y">
<size key="itemSize" width="50" height="50"/>
@ -533,8 +533,8 @@
</subviews>
<color key="backgroundColor" name="Accent Color"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="Akw-Iw-iVY">
<rect key="frame" x="-100" y="-100" width="370" height="16"/>
<scroller key="horizontalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="Akw-Iw-iVY" customClass="ThinScroller" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="0.0" y="59" width="379" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="MXo-gV-Bdf">
@ -553,10 +553,10 @@
<accessibility identifier="UpcomingEventView"/>
</customView>
<customView wantsLayer="YES" focusRingType="none" translatesAutoresizingMaskIntoConstraints="NO" id="B8X-sx-cjT">
<rect key="frame" x="0.0" y="0.0" width="370" height="40"/>
<rect key="frame" x="0.0" y="0.0" width="379" height="40"/>
<subviews>
<button toolTip="Close Clocker" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1cR-pI-osG">
<rect key="frame" x="320" y="7" width="30" height="26"/>
<rect key="frame" x="339" y="7" width="30" height="26"/>
<constraints>
<constraint firstAttribute="height" constant="25" id="WSi-Xj-Kfl"/>
<constraint firstAttribute="width" constant="30" id="j2s-C4-pK5"/>
@ -571,7 +571,7 @@
</connections>
</button>
<button toolTip="Switch between Menubar/Floating mode." verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="YXE-4J-5cn">
<rect key="frame" x="220" y="10" width="30" height="19"/>
<rect key="frame" x="180" y="10" width="30" height="19"/>
<constraints>
<constraint firstAttribute="width" constant="30" id="fWo-31-i3M"/>
<constraint firstAttribute="height" constant="18" id="v7I-PR-eTK"/>
@ -586,7 +586,7 @@
</connections>
</button>
<button toolTip="Share Clocker!" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Hc7-fH-V7i">
<rect key="frame" x="125" y="10" width="30" height="21"/>
<rect key="frame" x="95" y="10" width="30" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="Bnf-E1-uaE"/>
<constraint firstAttribute="width" constant="30" id="pke-4M-ob5"/>
@ -601,7 +601,7 @@
</connections>
</button>
<button toolTip="Open Preferences" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ctq-BV-GPN">
<rect key="frame" x="20" y="10" width="30" height="19"/>
<rect key="frame" x="10" y="10" width="30" height="19"/>
<constraints>
<constraint firstAttribute="width" constant="30" id="oaD-Rr-qht"/>
<constraint firstAttribute="height" constant="18" id="t4M-6L-Vqi"/>
@ -619,15 +619,15 @@
</button>
</subviews>
<constraints>
<constraint firstItem="YXE-4J-5cn" firstAttribute="leading" secondItem="Hc7-fH-V7i" secondAttribute="trailing" constant="65" id="0Zd-fd-Ove"/>
<constraint firstItem="YXE-4J-5cn" firstAttribute="leading" secondItem="Hc7-fH-V7i" secondAttribute="trailing" constant="55" id="0Zd-fd-Ove"/>
<constraint firstItem="Ctq-BV-GPN" firstAttribute="centerY" secondItem="B8X-sx-cjT" secondAttribute="centerY" id="6Q7-jc-cTL"/>
<constraint firstItem="YXE-4J-5cn" firstAttribute="centerY" secondItem="B8X-sx-cjT" secondAttribute="centerY" id="OHe-Tc-b0V"/>
<constraint firstItem="Hc7-fH-V7i" firstAttribute="leading" secondItem="Ctq-BV-GPN" secondAttribute="trailing" constant="75" id="bL5-Kt-zaC"/>
<constraint firstItem="Hc7-fH-V7i" firstAttribute="leading" secondItem="Ctq-BV-GPN" secondAttribute="trailing" constant="55" id="bL5-Kt-zaC"/>
<constraint firstAttribute="height" constant="40" id="iYW-fj-EE2"/>
<constraint firstItem="1cR-pI-osG" firstAttribute="centerY" secondItem="B8X-sx-cjT" secondAttribute="centerY" id="oVJ-Xa-cTw"/>
<constraint firstAttribute="trailing" secondItem="1cR-pI-osG" secondAttribute="trailing" constant="20" id="rb9-gW-QZS"/>
<constraint firstAttribute="trailing" secondItem="1cR-pI-osG" secondAttribute="trailing" constant="10" id="rb9-gW-QZS"/>
<constraint firstItem="Hc7-fH-V7i" firstAttribute="centerY" secondItem="B8X-sx-cjT" secondAttribute="centerY" constant="-1" id="vPp-mQ-wgE"/>
<constraint firstItem="Ctq-BV-GPN" firstAttribute="leading" secondItem="B8X-sx-cjT" secondAttribute="leading" constant="20" id="ydm-oF-sVc"/>
<constraint firstItem="Ctq-BV-GPN" firstAttribute="leading" secondItem="B8X-sx-cjT" secondAttribute="leading" constant="10" id="ydm-oF-sVc"/>
</constraints>
</customView>
</subviews>
@ -676,7 +676,6 @@
<resources>
<image name="Add Icon" width="700" height="700"/>
<image name="CurrentLocation" width="350" height="350"/>
<image name="Extra" width="700" height="700"/>
<image name="Float-White" width="15" height="13"/>
<image name="PowerIcon" width="350" height="350"/>
<image name="PowerIcon-White" width="350" height="350"/>

2
Clocker/Clocker/es.lproj/Localizable.strings

@ -75,7 +75,7 @@
/* Text for button that takes the user to the System Preferences app. In case the user hasn't given Calendar/Reminders access permission, this button takes you to the System Preferences app where the user can give proper permissions to Clocker. */
"Launch Preferences" = "Abrir las preferencias";
"Grant Access" = "Permitir acceso";
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Los próximos eventos de sus calendarios personales y compartidos pueden mostrarse en la barra de menú y en el panel.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Los próximos eventos de sus calendarios personales y compartidos pueden mostrarse en la barra de menú y en el panel.";
"Granted" = "Permitido";
"Denied" = "Denegado";
"Grant" = "Permitir";

2
Clocker/Clocker/fr.lproj/Localizable.strings

@ -75,7 +75,7 @@
/* Text for button that takes the user to the System Preferences app. In case the user hasn't given Calendar/Reminders access permission, this button takes you to the System Preferences app where the user can give proper permissions to Clocker. */
"Launch Preferences" = "Préférences de démarrage";
"Grant Access" = "Autoriser l'accès";
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Les événements à venir de vos calendriers personnels et partagés peuvent être affichés dans la barre de menus et dans le panneau.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Les événements à venir de vos calendriers personnels et partagés peuvent être affichés dans la barre de menus et dans le panneau.";
"Granted" = "Autorisé";
"Denied" = "Refusé";
"Grant" = "Autoriser";

2
Clocker/Clocker/hi.lproj/Localizable.strings

@ -70,7 +70,7 @@
"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.";
"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." = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Upcoming events from your calendars can be shown in the menubar + panel.";
"Granted" = "Granted";
"Denied" = "Denied";
"Grant" = "Grant";

2
Clocker/Clocker/hr.lproj/Localizable.strings

@ -75,7 +75,7 @@
/* Text for button that takes the user to the System Preferences app. In case the user hasn't given Calendar/Reminders access permission, this button takes you to the System Preferences app where the user can give proper permissions to Clocker. */
"Launch Preferences" = "Pokreni postavke";
"Grant Access" = "Dopusti pristup";
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Predstojeći događaji iz tvojih osobnih i zajedničkih kalendara mogu se prikazati u traci izbornika i na ploči.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Predstojeći događaji iz tvojih osobnih i zajedničkih kalendara mogu se prikazati u traci izbornika i na ploči.";
"Granted" = "Dodijeljeno";
"Denied" = "Odbijeno";
"Grant" = "Odobrenje";

4
Clocker/Clocker/it.lproj/Localizable.strings

@ -26,7 +26,7 @@
"Reminders Access" = "Reminders Access";
"Calendar Access" = "Calendar Access";
"Permissions" = "Permissions";
"Calendar Detail" = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"Calendar Detail" = "Upcoming events from your calendars can be shown in the menubar + panel.";
"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.";
"Granted Button Text" = "Granted";
@ -75,7 +75,7 @@
"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.";
"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." = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Upcoming events from your calendars can be shown in the menubar + panel.";
"Granted" = "Granted";
"Denied" = "Denied";
"Grant" = "Grant";

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

@ -309,7 +309,7 @@
"Upcoming Event View Options" = "Upcoming Event View Options";
"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.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Upcoming events from your calendars can be shown in the menubar + panel.";
"You have no events scheduled for tomorrow." = "You have no events scheduled for tomorrow.";

2
Clocker/Clocker/ko.lproj/Localizable.strings

@ -74,7 +74,7 @@
"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.";
"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." = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Upcoming events from your calendars can be shown in the menubar + panel.";
"Granted" = "Granted";
"Denied" = "Denied";
"Grant" = "Grant";

4
Clocker/Clocker/nl.lproj/Localizable.strings

@ -26,7 +26,7 @@
"Reminders Access" = "Reminders Access";
"Calendar Access" = "Calendar Access";
"Permissions" = "Permissions";
"Calendar Detail" = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"Calendar Detail" = "Upcoming events from your calendars can be shown in the menubar + panel.";
"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.";
"Granted Button Text" = "Granted";
@ -74,7 +74,7 @@
"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.";
"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." = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Upcoming events from your calendars can be shown in the menubar + panel.";
"Granted" = "Granted";
"Denied" = "Denied";
"Grant" = "Grant";

4
Clocker/Clocker/pl.lproj/Localizable.strings

@ -26,7 +26,7 @@
"Reminders Access" = "Dostęp do powiadomień";
"Calendar Access" = "Dostęp do kalendarza";
"Permissions" = "Uprawnienia";
"Calendar Detail" = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"Calendar Detail" = "Upcoming events from your calendars can be shown in the menubar + panel.";
"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.";
"Granted Button Text" = "Przyznane";
@ -75,7 +75,7 @@
/* Text for button that takes the user to the System Preferences app. In case the user hasn't given Calendar/Reminders access permission, this button takes you to the System Preferences app where the user can give proper permissions to Clocker. */
"Launch Preferences" = "Preferencje uruchomienia";
"Grant Access" = "Przyznaj dostęp";
"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.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Upcoming events from your calendars can be shown in the menubar + panel.";
"Granted" = "Granted";
"Denied" = "Denied";
"Grant" = "Grant";

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

@ -75,7 +75,7 @@
/* Text for button that takes the user to the System Preferences app. In case the user hasn't given Calendar/Reminders access permission, this button takes you to the System Preferences app where the user can give proper permissions to Clocker. */
"Launch Preferences" = "Abrir Preferências";
"Grant Access" = "Conceder Acesso";
"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.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Próximos eventos de seus calendários pessoais e compartilhados podem ser exibidos no menu e no painel.";
"Granted" = "Concedido";
"Denied" = "Negado";
"Grant" = "Conceder";

2
Clocker/Clocker/ru.lproj/Localizable.strings

@ -67,7 +67,7 @@
"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." = "Предстоящие события из ваших персонального и общего календарей могут быть показаны в верхнем меню и панели.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Предстоящие события из ваших персонального и общего календарей могут быть показаны в верхнем меню и панели.";
"Granted" = "Предоставлено";
"Denied" = "Отказано";
"Grant" = "Разрешить";

2
Clocker/Clocker/tr.lproj/Localizable.strings

@ -75,7 +75,7 @@
/* Text for button that takes the user to the System Preferences app. In case the user hasn't given Calendar/Reminders access permission, this button takes you to the System Preferences app where the user can give proper permissions to Clocker. */
"Launch Preferences" = "Başlatma Tercihleri";
"Grant Access" = "Erişim izni ver";
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Kişisel veya paylaşılan takvimlerinizdeki yaklaşan etkinlikler menü çubuğunda veya panelde görünebilir.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Kişisel veya paylaşılan takvimlerinizdeki yaklaşan etkinlikler menü çubuğunda veya panelde görünebilir.";
"Granted" = "İzin verildi";
"Denied" = "Reddedildi";
"Grant" = "Erişim ver";

4
Clocker/Clocker/uk.lproj/Localizable.strings

@ -26,7 +26,7 @@
"Reminders Access" = "Доступ до Нагадувань";
"Calendar Access" = "Доступ до Календаря";
"Permissions" = "Дозволи";
"Calendar Detail" = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"Calendar Detail" = "Upcoming events from your calendars can be shown in the menubar + panel.";
"Reminders Detail" = "Встановіть нагадування в часовому поясі вибраного вами місця. Ваші нагадування зберігаються в програмі Нагадування за умовчанням.";
"Privacy Text" = "You can change this later in the Privacy section of the System Preferences.";
"Granted Button Text" = "Надано";
@ -75,7 +75,7 @@
/* Text for button that takes the user to the System Preferences app. In case the user hasn't given Calendar/Reminders access permission, this button takes you to the System Preferences app where the user can give proper permissions to Clocker. */
"Launch Preferences" = "Відкрити Системні параметри";
"Grant Access" = "Надати доступ";
"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.";
"Upcoming events from your calendars can be shown in the menubar + panel." = "Upcoming events from your calendars can be shown in the menubar + panel.";
"Granted" = "Надано";
"Denied" = "Відмовлено";
"Grant" = "Надати";

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

@ -67,7 +67,7 @@
"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." = "你个人和共享日历的未来事件将显示在菜单栏和面板上。";
"Upcoming events from your calendars can be shown in the menubar + panel." = "你个人和共享日历的未来事件将显示在菜单栏和面板上。";
"Granted" = "已授权";
"Denied" = "已拒绝";
"Grant" = "授权";

2
Clocker/Clocker/zh-Hant.lproj/Localizable.strings

@ -309,7 +309,7 @@
"Upcoming Event View Options" = "即將到來的行程顯示選項";
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "即將到來的行程會在選單列和面板中顯示。";
"Upcoming events from your calendars can be shown in the menubar + panel." = "即將到來的行程會在選單列和面板中顯示。";
"You have no events scheduled for tomorrow." = "您明天沒有排任何行程。";

9
Clocker/ClockerUITests/CopyToClipboardTests.swift

@ -42,15 +42,10 @@ class CopyToClipboardTests: XCTestCase {
let time = cell.staticTexts["ActualTime"].value ?? "Nil Value"
clipboardValue.append("\(time)")
}
app.buttons["Share"].click()
app/*@START_MENU_TOKEN@*/ .menuItems["Copy All Times"]/*[[".dialogs[\"Clocker Panel\"]",".buttons[\"Share\"]",".menus.menuItems[\"Copy All Times\"]",".menuItems[\"Copy All Times\"]"],[[[-1,3],[-1,2],[-1,1,2],[-1,0,1]],[[-1,3],[-1,2],[-1,1,2]],[[-1,3],[-1,2]]],[0]]@END_MENU_TOKEN@*/ .click()
if let clipboard = NSPasteboard.general.string(forType: .string) {
for item in clipboardValue {
XCTAssertTrue(clipboard.contains(item))
}
}
}
func testModernSlider() {

10
Clocker/ClockerUnitTests/AppDelegateTests.swift

@ -20,7 +20,7 @@ class AppDelegateTests: XCTestCase {
XCTAssertEqual(dockMenu?.title, "Quick Access")
XCTAssertEqual(items.first?.title, "Toggle Panel")
XCTAssertEqual(items[1].title, "Preferences")
XCTAssertEqual(items[1].title, "Settings")
XCTAssertEqual(items[1].keyEquivalent, ",")
XCTAssertEqual(items[2].title, "Hide from Dock")
@ -102,7 +102,9 @@ class AppDelegateTests: XCTestCase {
timezone1.formattedAddress = "MenubarTimezone"
timezone1.isFavourite = 1
// Encode it in UserDefaults
let encodedTimezone = NSKeyedArchiver.archivedData(withRootObject: timezone1)
guard let encodedTimezone = NSKeyedArchiver.clocker_archive(with: timezone1) else {
return
}
DataStore.shared().setTimezones([encodedTimezone])
subject?.setupMenubarTimer()
@ -131,7 +133,9 @@ class AppDelegateTests: XCTestCase {
timezone1.formattedAddress = "MenubarTimezone"
timezone1.isFavourite = 1
// Encode it in UserDefaults
let encodedTimezone = NSKeyedArchiver.archivedData(withRootObject: timezone1)
guard let encodedTimezone = NSKeyedArchiver.clocker_archive(with: timezone1) else {
return
}
DataStore.shared().setTimezones([encodedTimezone])
subject?.setupMenubarTimer()

8
Clocker/ClockerUnitTests/ClockerUnitTests.swift

@ -170,10 +170,14 @@ class ClockerUnitTests: XCTestCase {
// The below test might fail outside California or if DST is active!
// CI is calibrated to be on LA timezone!
func testTimeDifference() {
XCTAssertTrue(operations.timeDifference() == ", 9h 30m ahead", "Difference was unexpectedly: \(operations.timeDifference())")
let observingDaylightSavings = TimeZone.autoupdatingCurrent.isDaylightSavingTime(for: Date())
let expectedDifference = observingDaylightSavings ? ", 9h 30m ahead" : ", 10h 30m ahead"
let expectedDifferenceForAuckland = observingDaylightSavings ? ", 16h ahead" : ", 18h ahead"
XCTAssertTrue(operations.timeDifference() == expectedDifference, "Difference was unexpectedly: \(operations.timeDifference())")
XCTAssertTrue(californiaOperations.timeDifference() == ", 3h behind", "Difference was unexpectedly: \(californiaOperations.timeDifference())")
XCTAssertTrue(floridaOperations.timeDifference() == "", "Difference was unexpectedly: \(floridaOperations.timeDifference())")
XCTAssertTrue(aucklandOperations.timeDifference() == ", 16h ahead", "Difference was unexpectedly: \(aucklandOperations.timeDifference())")
XCTAssertTrue(aucklandOperations.timeDifference() == expectedDifferenceForAuckland, "Difference was unexpectedly: \(aucklandOperations.timeDifference())")
XCTAssertTrue(omahaOperations.timeDifference() == ", 1h behind", "Difference was unexpectedly: \(omahaOperations.timeDifference())")
}

4
Clocker/ClockerUnitTests/SearchDataSourceTests.swift

@ -106,7 +106,9 @@ class SearchDataSourceTests: XCTestCase {
setupMockData()
let result = subject.retrieveSelectedTimezone(0)
XCTAssert(result.timezone.abbreviation == "PDT")
let possibleOutcomes = Set<String>(["PDT", "PST"])
XCTAssert(possibleOutcomes.contains(result.timezone.abbreviation ?? "NA"),
"Result timezone is actually \(result.timezone.abbreviation ?? "NA")")
}
func testRetrieveSelectedTimezoneWithEmptySearchField() {

4
Clocker/ClockerUnitTests/StandardMenubarHandlerTests.swift

@ -31,7 +31,9 @@ class StandardMenubarHandlerTests: XCTestCase {
at index: Int = -1)
{
var defaults = store.timezones()
let encodedObject = NSKeyedArchiver.archivedData(withRootObject: object as Any)
guard let encodedObject = NSKeyedArchiver.clocker_archive(with: object as Any) else {
return
}
index == -1 ? defaults.append(encodedObject) : defaults.insert(encodedObject, at: index)
store.setTimezones(defaults)
}

14
Clocker/CoreModelKit/Sources/CoreModelKit/TimezoneData.swift

@ -27,7 +27,11 @@ public enum DateFormat {
}
// Non-class type cannot conform to NSCoding!
public class TimezoneData: NSObject, NSCoding {
public class TimezoneData: NSObject, NSCoding, NSSecureCoding {
public static var supportsSecureCoding: Bool {
return true
}
public enum SelectionType: Int {
case city
case timezone
@ -267,6 +271,14 @@ public class TimezoneData: NSObject, NSCoding {
let formatInString = TimezoneData.values[key] ?? DateFormat.twelveHour
return formatInString.contains("ss")
}
public func isDaylightSavings() -> Bool {
guard let timezone = TimeZone(abbreviation: timezone()) else {
return false
}
return timezone.isDaylightSavingTime(for: Date())
}
override public var hash: Int {
guard let placeIdentifier = placeID, let timezone = timezoneID else {

2
Clocker/Events and Reminders/CalendarHandler.swift

@ -196,7 +196,7 @@ extension EventCenter {
for date in eventsForDate.keys {
if let events = eventsForDate[date] {
for event in events {
if selectedCalendars.contains(event.event.calendar.calendarIdentifier) {
if event.event.calendar != nil && selectedCalendars.contains(event.event.calendar.calendarIdentifier) {
if filteredEvents[date] == nil {
filteredEvents[date] = Array()
}

24
Clocker/Onboarding/Onboarding.storyboard

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="fde-UX-327">
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="21701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="fde-UX-327">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21701"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
@ -167,14 +167,6 @@ DQ
<rect key="frame" x="0.0" y="0.0" width="436" height="400"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="N6Z-mh-pET">
<rect key="frame" x="18" y="6" width="400" height="18"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" id="lMj-6p-4uB">
<font key="font" size="13" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="mF9-1w-sxR">
<rect key="frame" x="20" y="184" width="396" height="100"/>
<subviews>
@ -197,7 +189,7 @@ DQ
</connections>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="749" translatesAutoresizingMaskIntoConstraints="NO" id="gHR-Pd-9pP">
<rect key="frame" x="8" y="5" width="370" height="52"/>
<rect key="frame" x="8" y="5" width="370" height="57"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" placeholderString="Reminder Access Detail" id="zbc-CH-UBI">
<font key="font" size="12" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -209,7 +201,7 @@ DQ
</progressIndicator>
</subviews>
<constraints>
<constraint firstItem="gHR-Pd-9pP" firstAttribute="top" secondItem="Lef-GT-zuM" secondAttribute="bottom" constant="15" id="1ke-VP-hq5"/>
<constraint firstItem="gHR-Pd-9pP" firstAttribute="top" secondItem="Lef-GT-zuM" secondAttribute="bottom" constant="10" id="1ke-VP-hq5"/>
<constraint firstItem="Lef-GT-zuM" firstAttribute="leading" secondItem="mF9-1w-sxR" secondAttribute="leading" constant="10" id="2Re-VO-tfj"/>
<constraint firstItem="gHR-Pd-9pP" firstAttribute="leading" secondItem="mF9-1w-sxR" secondAttribute="leading" constant="10" id="B1U-lb-GUc"/>
<constraint firstItem="Lef-GT-zuM" firstAttribute="top" secondItem="mF9-1w-sxR" secondAttribute="top" constant="10" id="S18-SM-uCW"/>
@ -223,7 +215,7 @@ DQ
</constraints>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="4eB-eD-0jK">
<rect key="frame" x="20" y="44" width="396" height="100"/>
<rect key="frame" x="20" y="64" width="396" height="100"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="noJ-fx-c1b">
<rect key="frame" x="8" y="48" width="148" height="42"/>
@ -311,17 +303,14 @@ DQ
<constraint firstAttribute="trailing" secondItem="mF9-1w-sxR" secondAttribute="trailing" constant="20" id="6Eh-Fo-RdG"/>
<constraint firstItem="iMf-Uy-zAf" firstAttribute="leading" secondItem="pC3-D3-DSa" secondAttribute="leading" constant="2" id="70x-kK-e8k"/>
<constraint firstItem="4eB-eD-0jK" firstAttribute="leading" secondItem="mF9-1w-sxR" secondAttribute="leading" id="HVv-ry-gqb"/>
<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="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="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="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="20" 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="XfU-36-tPs" firstAttribute="leading" secondItem="sib-OR-ym5" secondAttribute="leading" constant="20" id="o7n-nQ-6TG"/>
<constraint firstItem="mF9-1w-sxR" firstAttribute="leading" secondItem="sib-OR-ym5" secondAttribute="leading" constant="20" id="pco-hw-yLC"/>
<constraint firstItem="pC3-D3-DSa" firstAttribute="top" secondItem="XfU-36-tPs" secondAttribute="top" id="tD2-vW-0Qp"/>
<constraint firstItem="N6Z-mh-pET" firstAttribute="trailing" secondItem="4eB-eD-0jK" secondAttribute="trailing" id="uAP-KZ-kV2"/>
<constraint firstAttribute="trailing" secondItem="iMf-Uy-zAf" secondAttribute="trailing" constant="10" id="vPf-CV-JBC"/>
</constraints>
</view>
@ -333,7 +322,6 @@ DQ
<outlet property="calendarHeaderLabel" destination="noJ-fx-c1b" id="um0-dZ-q3r"/>
<outlet property="calendarView" destination="4eB-eD-0jK" id="jpn-uQ-Dk1"/>
<outlet property="onboardingTypeLabel" destination="iMf-Uy-zAf" id="saQ-ta-oT8"/>
<outlet property="privacyLabel" destination="N6Z-mh-pET" id="DD9-WG-5WT"/>
<outlet property="reminderActivityIndicator" destination="Zhi-9z-C2u" id="GRE-KJ-HT7"/>
<outlet property="reminderDetailLabel" destination="gHR-Pd-9pP" id="smO-us-iu1"/>
<outlet property="reminderGrantButton" destination="O0s-Bu-IPq" id="bep-Ox-ego"/>

40
Clocker/Onboarding/OnboardingPermissionsViewController.swift

@ -9,9 +9,11 @@ class OnboardingPermissionsViewController: NSViewController {
@IBOutlet var reminderView: NSView!
@IBOutlet var calendarView: NSView!
@IBOutlet var locationView: NSView!
@IBOutlet var reminderActivityIndicator: NSProgressIndicator!
@IBOutlet var calendarActivityIndicator: NSProgressIndicator!
@IBOutlet var locationActivityIndicator: NSProgressIndicator!
@IBOutlet var appLabel: NSTextField!
@IBOutlet var onboardingTypeLabel: NSTextField!
@ -21,6 +23,9 @@ class OnboardingPermissionsViewController: NSViewController {
@IBOutlet var calendarHeaderLabel: NSTextField!
@IBOutlet var calendarDetailLabel: NSTextField!
@IBOutlet var locationHeaderLabel: NSTextField!
@IBOutlet var locationDetailLabel: NSTextField!
@IBOutlet var privacyLabel: NSTextField!
@ -36,36 +41,29 @@ class OnboardingPermissionsViewController: NSViewController {
}
private func setup() {
appLabel.stringValue = NSLocalizedString("Permissions Tab",
comment: "Title for Permissions screen")
onboardingTypeLabel.stringValue = NSLocalizedString("Later Config Description",
comment: "Describing we can change the options later in System Preferences")
appLabel.stringValue = NSLocalizedString("Permissions Tab", comment: "Title for Permissions screen")
onboardingTypeLabel.stringValue = "Your data doesn't leave your device 🔐"
reminderHeaderLabel.stringValue = NSLocalizedString("Reminders Access Title",
comment: "Title for Reminders Access Label")
reminderDetailLabel.stringValue = "Set reminders in the timezone of the location of your choice. Your reminders are stored in the default Reminders app. "
reminderHeaderLabel.stringValue = NSLocalizedString("Reminders Access Title",comment: "Title for Reminders Access Label")
reminderDetailLabel.stringValue = "Set reminders in the timezone of the location of your choice. Your reminders are stored in the default Reminders app."
calendarHeaderLabel.stringValue = NSLocalizedString("Calendar Access Title",
comment: "Title for Calendar access label")
calendarHeaderLabel.stringValue = NSLocalizedString("Calendar Access Title",comment: "Title for Calendar access label")
calendarDetailLabel.stringValue = "Calendar Detail".localized()
privacyLabel.stringValue = CLEmptyString
[calendarHeaderLabel, calendarDetailLabel, privacyLabel, reminderDetailLabel, reminderHeaderLabel, onboardingTypeLabel, appLabel].forEach { $0?.textColor = Themer.shared().mainTextColor()
}
}
private func setupButtons() {
/*
if LocationController.sharedInstance.locationAccessGranted() {
locationButton.title = "Granted"
} else if LocationController.sharedInstance.locationAccessDenied() {
locationButton.title = "Denied"
} else if LocationController.sharedInstance.locationAccessNotDetermined() {
locationButton.title = "Grant"
} else {
locationButton.title = "Unexpected"
} */
// if LocationController.sharedInstance.locationAccessGranted() {
// locationButton.title = "Granted"
// } else if LocationController.sharedInstance.locationAccessDenied() {
// locationButton.title = "Denied"
// } else if LocationController.sharedInstance.locationAccessNotDetermined() {
// locationButton.title = "Grant"
// } else {
// locationButton.title = "Unexpected"
// }
if EventCenter.sharedCenter().calendarAccessGranted() {
calendarGrantButton.title = "Granted".localized()

2
Clocker/Onboarding/OnboardingSearchController.swift

@ -50,7 +50,7 @@ class OnboardingSearchController: NSViewController {
resultsTableView.target = self
resultsTableView.doubleAction = #selector(doubleClickAction(_:))
if #available(OSX 11.0, *) {
resultsTableView.style = .fullWidth
resultsTableView.style = .plain
}
setup()

3
Clocker/Overall App/AppDefaults.swift

@ -20,7 +20,6 @@ class AppDefaults {
}
private class func defaultsDictionary() -> [String: Any] {
// Local var for calendars to silence "empty collection requires an explicit type"
let calendars: [String] = []
return [CLThemeKey: 0,
CLDisplayFutureSliderKey: 0,
@ -46,7 +45,7 @@ class AppDefaults {
extension UserDefaults {
// Use this with caution. Exposing this for debugging purposes only.
func wipe(for bundleID: String) {
func wipe(for bundleID: String = "com.abhishek.Clocker") {
removePersistentDomain(forName: bundleID)
}
}

4
Clocker/Overall App/DataStore.swift

@ -128,7 +128,9 @@ class DataStore: NSObject {
}
func addTimezone(_ timezone: TimezoneData) {
let encodedTimezone = NSKeyedArchiver.archivedData(withRootObject: timezone)
guard let encodedTimezone = NSKeyedArchiver.clocker_archive(with: timezone) else {
return
}
var defaults: [Data] = timezones()
defaults.append(encodedTimezone)

15
Clocker/Overall App/Foundation + Additions.swift

@ -56,3 +56,18 @@ public extension Data {
}
}
}
extension NSKeyedArchiver {
static func clocker_archive(with object: Any) -> Data? {
if #available(macOS 10.14, *) {
return try! NSKeyedArchiver.archivedData(withRootObject: object, requiringSecureCoding: true)
}
if #available(macOS 10.13, *) {
return NSKeyedArchiver.archivedData(withRootObject: object)
}
return nil
}
}

16
Clocker/Overall App/Themer.swift

@ -277,6 +277,22 @@ extension Themer {
NSImage(named: NSImage.Name("ExtraHighlighted"))!,
NSImage(named: NSImage.Name("ExtraWhiteHighlighted"))!)
}
func copyImage() -> NSImage {
if let copyImage = symbolImage(for: "doc.on.doc") {
return copyImage
}
return NSImage()
}
func highlightedCopyImage() -> NSImage? {
if let copyImage = symbolImage(for: "doc.on.doc.fill") {
return copyImage
}
return nil
}
func sharingImage() -> NSImage {
if let sharingImage = symbolImage(for: "square.and.arrow.up.on.square.fill") {

4
Clocker/Panel/Data Layer/TimezoneDataOperations.swift

@ -421,7 +421,9 @@ extension TimezoneDataOperations {
func saveObject(at index: Int = -1) {
var defaults = store.timezones()
let encodedObject = NSKeyedArchiver.archivedData(withRootObject: dataObject as Any)
guard let encodedObject = NSKeyedArchiver.clocker_archive(with:dataObject as Any) else {
return
}
index == -1 ? defaults.append(encodedObject) : defaults.insert(encodedObject, at: index)
store.setTimezones(defaults)
}

9
Clocker/Panel/Notes Popover/NotesPopover.swift

@ -315,8 +315,9 @@ class NotesPopover: NSViewController {
}
private func insertTimezoneInDefaultPreferences() {
guard let model = dataObject, var timezones = timezoneObjects else { return }
let encodedObject = NSKeyedArchiver.archivedData(withRootObject: model)
guard let model = dataObject, var timezones = timezoneObjects,
let encodedObject = NSKeyedArchiver.clocker_archive(with:model) else { return }
timezones[currentRow] = encodedObject
DataStore.shared().setTimezones(timezones)
}
@ -341,7 +342,9 @@ class NotesPopover: NSViewController {
var datas: [Data] = []
for updatedObject in timezoneObjects {
let dataObject = NSKeyedArchiver.archivedData(withRootObject: updatedObject)
guard let dataObject = NSKeyedArchiver.clocker_archive(with: updatedObject) else {
continue
}
datas.append(dataObject)
}

2
Clocker/Panel/PanelController.swift

@ -398,6 +398,8 @@ extension PanelController: NSWindowDelegate {
}
func windowDidResignKey(_: Notification) {
parentTimer = nil
if let isVisible = window?.isVisible, isVisible == true {
setActivePanel(newValue: false)
}

15
Clocker/Panel/ParentPanelController.swift

@ -158,7 +158,7 @@ class ParentPanelController: NSWindowController {
mainTableView.selectionHighlightStyle = .none
mainTableView.enclosingScrollView?.hasVerticalScroller = false
if #available(OSX 11.0, *) {
mainTableView.style = .fullWidth
mainTableView.style = .plain
}
// Setup images
@ -179,7 +179,7 @@ class ParentPanelController: NSWindowController {
green: 150.0 / 255.0,
blue: 122.0 / 255.0,
alpha: 0.5).cgColor
stackView.arrangedSubviews.last?.toolTip = "Clocker is running in Debug Mode"
stackView.arrangedSubviews.last?.toolTip = "Debug Mode"
#endif
// Setup layers
@ -285,7 +285,9 @@ class ParentPanelController: NSWindowController {
var datas: [Data] = []
for updatedObject in timezoneObjects {
let dataObject = NSKeyedArchiver.archivedData(withRootObject: updatedObject)
guard let dataObject = NSKeyedArchiver.clocker_archive(with: updatedObject) else {
continue
}
datas.append(dataObject)
}
@ -1039,7 +1041,7 @@ class ParentPanelController: NSWindowController {
action: #selector(reportIssue), keyEquivalent: "")
let localizeClocker = NSMenuItem(title: "Localize Clocker...",
action: #selector(openCrowdin), keyEquivalent: "")
let openPreferences = NSMenuItem(title: "Preferences",
let openPreferences = NSMenuItem(title: "Settings",
action: #selector(openPreferencesWindow), keyEquivalent: "")
let appDisplayName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") ?? "Clocker"
@ -1079,7 +1081,10 @@ extension ParentPanelController: NSSharingServicePickerDelegate {
}
func sharingServicePicker(_: NSSharingServicePicker, sharingServicesForItems _: [Any], proposedSharingServices proposed: [NSSharingService]) -> [NSSharingService] {
let copySharingService = NSSharingService(title: "Copy All Times", image: NSImage(), alternateImage: nil) { [weak self] in
let themer = Themer.shared()
let copySharingService = NSSharingService(title: "Copy All Times",
image:themer.copyImage(),
alternateImage: themer.highlightedCopyImage()) { [weak self] in
guard let strongSelf = self else { return }
let clipboardCopy = strongSelf.retrieveAllTimes()
let pasteboard = NSPasteboard.general

26
Clocker/Panel/UI/FloatingWindow.xib

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
@ -35,12 +35,12 @@
<windowStyleMask key="styleMask" titled="YES" closable="YES" resizable="YES" utility="YES" nonactivatingPanel="YES" texturedBackground="YES"/>
<windowCollectionBehavior key="collectionBehavior" moveToActiveSpace="YES" ignoresCycle="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="1000" y="379" width="350" height="460"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
<rect key="contentRect" x="1000" y="379" width="300" height="460"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
<value key="minSize" type="size" width="150" height="50"/>
<value key="maxSize" type="size" width="350" height="800"/>
<value key="maxSize" type="size" width="300" height="800"/>
<view key="contentView" misplaced="YES" id="qEx-SC-5Qd">
<rect key="frame" x="0.0" y="0.0" width="350" height="460"/>
<rect key="frame" x="0.0" y="0.0" width="300" height="460"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<stackView focusRingType="none" distribution="fill" orientation="vertical" alignment="leading" spacing="0.0" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Bn4-fy-Lm6">
@ -59,7 +59,7 @@
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="337.80335195531063" minWidth="303" maxWidth="1000" id="009-6N-KRz">
<tableColumn width="338" minWidth="303" maxWidth="1000" id="009-6N-KRz">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
@ -381,7 +381,7 @@
</subviews>
<color key="backgroundColor" name="Accent Color"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="MFX-8H-T4e">
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="MFX-8H-T4e" customClass="ThinScroller" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="-100" y="-100" width="370" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
@ -419,7 +419,7 @@
</connections>
</button>
<button toolTip="Switch between Menubar/Floating mode." verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="KWj-8n-2K0">
<rect key="frame" x="219" y="10" width="29" height="19"/>
<rect key="frame" x="184" y="10" width="29" height="19"/>
<constraints>
<constraint firstAttribute="height" constant="18" id="8yd-3c-2Nc"/>
<constraint firstAttribute="width" constant="29" id="D7P-eC-faV"/>
@ -434,7 +434,7 @@
</connections>
</button>
<button toolTip="Share Clocker!" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="GMo-5B-bnh">
<rect key="frame" x="119" y="7" width="30" height="26"/>
<rect key="frame" x="99" y="7" width="30" height="26"/>
<constraints>
<constraint firstAttribute="height" constant="25" id="WBC-l8-Gc1"/>
<constraint firstAttribute="width" constant="30" id="h85-UM-Kfy"/>
@ -467,8 +467,8 @@
</button>
</subviews>
<constraints>
<constraint firstItem="KWj-8n-2K0" firstAttribute="leading" secondItem="GMo-5B-bnh" secondAttribute="trailing" constant="70" id="0wr-fp-XKy"/>
<constraint firstItem="GMo-5B-bnh" firstAttribute="leading" secondItem="iFk-kj-d5a" secondAttribute="trailing" constant="70" id="6Kp-gC-dhg"/>
<constraint firstItem="KWj-8n-2K0" firstAttribute="leading" secondItem="GMo-5B-bnh" secondAttribute="trailing" constant="55" id="0wr-fp-XKy"/>
<constraint firstItem="GMo-5B-bnh" firstAttribute="leading" secondItem="iFk-kj-d5a" secondAttribute="trailing" constant="50" id="6Kp-gC-dhg"/>
<constraint firstItem="iFk-kj-d5a" firstAttribute="leading" secondItem="YQL-kL-NAx" secondAttribute="leading" constant="20" id="NW8-KV-vPc"/>
<constraint firstItem="GMo-5B-bnh" firstAttribute="centerY" secondItem="YQL-kL-NAx" secondAttribute="centerY" id="Pfa-z9-wko"/>
<constraint firstItem="KWj-8n-2K0" firstAttribute="centerY" secondItem="YQL-kL-NAx" secondAttribute="centerY" id="iVM-fu-Mx5"/>
@ -521,7 +521,7 @@
<image name="CurrentLocation" width="350" height="350"/>
<image name="Extra" width="700" height="700"/>
<image name="Float" width="15" height="13"/>
<image name="NSShareTemplate" width="15" height="17"/>
<image name="NSShareTemplate" width="19" height="22"/>
<image name="PowerIcon" width="350" height="350"/>
<image name="Sunrise" width="700" height="700"/>
<namedColor name="Accent Color">

3
Clocker/Panel/UI/PanelTableView.swift

@ -66,7 +66,8 @@ class PanelTableView: NSTableView {
if row != hoverRow {
hoverRow = row
panelDelegate?.tableView(self, didHoverOver: hoverRow)
setNeedsDisplay()
// setNeedsDisplay is deprecated in 10.14
needsDisplay = true
}
}

2
Clocker/Panel/UI/TimezoneDataSource.swift

@ -205,7 +205,7 @@ extension TimezoneDataSource: PanelTableViewDelegate {
}
rowCellView.extraOptions.alphaValue = (rowIndex == row) ? 1 : 0.5
if rowIndex == row, let hoverString = hoverStringForSelectedRow(row: row) {
if rowIndex == row, let hoverString = hoverStringForSelectedRow(row: row), sliderValue == 0 {
rowCellView.relativeDate.stringValue = hoverString
}
}

1
Clocker/Panel/Upcoming Events/ParentPanelController+UpcomingEvents.swift

@ -23,6 +23,7 @@ extension ParentPanelController {
upcomingEventCollectionView.setAccessibility("UpcomingEventCollectionView")
upcomingEventCollectionView.dataSource = upcomingEventsDataSource
upcomingEventCollectionView.delegate = upcomingEventsDataSource
upcomingEventCollectionView.enclosingScrollView?.autohidesScrollers = true
}
}
}

2
Clocker/Panel/Upcoming Events/UpcomingEventsDataSource.swift

@ -7,7 +7,7 @@ class UpcomingEventsDataSource: NSObject, NSCollectionViewDataSource, NSCollecti
private var upcomingEvents: [EventInfo] = []
private var eventCenter: EventCenter!
private weak var delegate: UpcomingEventPanelDelegate?
private static let panelWidth: CGFloat = 350.0
private static let panelWidth: CGFloat = 300.0
init(_ panelDelegate: UpcomingEventPanelDelegate?, _ center: EventCenter) {
super.init()

6
Clocker/Preferences/General/PreferencesDataSource.swift

@ -42,7 +42,7 @@ extension PreferencesDataSource: NSTableViewDelegate {
}
func tableView(_: NSTableView, writeRowsWith rowIndexes: IndexSet, to pboard: NSPasteboard) -> Bool {
let data = NSKeyedArchiver.archivedData(withRootObject: rowIndexes)
let data = NSKeyedArchiver.clocker_archive(with: rowIndexes)
pboard.declareTypes([.dragSession], owner: self)
pboard.setData(data, forType: .dragSession)
@ -184,7 +184,9 @@ extension PreferencesDataSource: NSTableViewDataSource {
}
private func insert(timezone: TimezoneData, at index: Int) {
let encodedObject = NSKeyedArchiver.archivedData(withRootObject: timezone)
guard let encodedObject = NSKeyedArchiver.clocker_archive(with: timezone) else {
return
}
var newDefaults = selectedTimezones
newDefaults[index] = encodedObject
store.setTimezones(newDefaults)

6
Clocker/Preferences/General/PreferencesViewController.swift

@ -79,7 +79,7 @@ class PreferencesViewController: ParentViewController {
let dictionary = NSDictionary(contentsOfFile: path),
let apiKey = dictionary["GeocodingKey"] as? String
else {
// assertionFailure("Unable to find the API key")
assertionFailure("Unable to find the API key")
return ""
}
return apiKey
@ -977,7 +977,9 @@ extension PreferencesViewController: SRRecorderControlDelegate {}
// Helpers
extension PreferencesViewController {
private func insert(timezone: TimezoneData, at index: Int) {
let encodedObject = NSKeyedArchiver.archivedData(withRootObject: timezone)
guard let encodedObject = NSKeyedArchiver.clocker_archive(with: timezone) else {
return
}
var newDefaults = selectedTimeZones
newDefaults[index] = encodedObject
DataStore.shared().setTimezones(newDefaults)

29
Clocker/Preferences/Menu Bar/StatusContainerView.swift

@ -38,6 +38,7 @@ func compactWidth(for timezone: TimezoneData, with store: DataStore) -> Int {
// Test with Sat 12:46 AM
let bufferWidth: CGFloat = 9.5
let upcomingEventBufferWidth: CGFloat = 32.5
protocol StatusItemViewConforming {
/// Mark that we need to refresh the text we're showing in the menubar
@ -97,7 +98,7 @@ class StatusContainerView: NSView {
NSAttributedString.Key.paragraphStyle: defaultParagraphStyle,
]
func containerWidth(for timezones: [Data], meetingTitle: String?, subtitle: String?) -> CGFloat {
func containerWidth(for timezones: [Data], event: EventInfo?) -> CGFloat {
var compressedWidth = timezones.reduce(0.0) { result, timezone -> CGFloat in
if let timezoneObject = TimezoneData.customObject(from: timezone) {
@ -118,9 +119,9 @@ class StatusContainerView: NSView {
}
if showUpcomingEventView {
let calculateMeetingHeaderSize = compactModeTimeFont.size(for: meetingTitle ?? "", width: 70, attributes: timeBasedAttributes)
let calculatedMeetingSubtitleSize = compactModeTimeFont.size(for: subtitle ?? "", width: 70, attributes: timeBasedAttributes)
compressedWidth += CGFloat(min(calculateMeetingHeaderSize.width, calculatedMeetingSubtitleSize.width) + 5.0)
let calculateMeetingHeaderSize = compactModeTimeFont.size(for: upcomingEvent?.event.title ?? "", width: 70, attributes: timeBasedAttributes)
let calculatedMeetingSubtitleSize = compactModeTimeFont.size(for: upcomingEvent?.metadataForMeeting() ?? "", width: 55, attributes: timeBasedAttributes)
compressedWidth += CGFloat(min(calculateMeetingHeaderSize.width, calculatedMeetingSubtitleSize.width) + bufferWidth + upcomingEventBufferWidth)
}
let calculatedWidth = min(compressedWidth,
@ -128,14 +129,10 @@ class StatusContainerView: NSView {
return calculatedWidth
}
var title: String?
var meetingMetadata: String?
if let events = EventCenter.sharedCenter().eventsForDate[NSCalendar.autoupdatingCurrent.startOfDay(for: Date())], let upcomingEvent = EventCenter.sharedCenter().nextOccuring(events) {
title = upcomingEvent.event.title
meetingMetadata = upcomingEvent.metadataForMeeting()
}
let events = EventCenter.sharedCenter().eventsForDate[NSCalendar.autoupdatingCurrent.startOfDay(for: Date())]
let upcomingEvent = EventCenter.sharedCenter().nextOccuring(events ?? [])
let statusItemWidth = containerWidth(for: timezones, meetingTitle: title, subtitle: meetingMetadata)
let statusItemWidth = containerWidth(for: timezones, event: upcomingEvent)
let frame = NSRect(x: 0, y: 0, width: statusItemWidth, height: 30)
super.init(frame: frame)
@ -238,6 +235,16 @@ class StatusContainerView: NSView {
y: statusItem.frame.origin.y,
width: newBestWidth,
height: statusItem.frame.size.height)
} else if let upcomingEventView = $0 as? UpcomingEventStatusItemView, upcomingEventView.isHidden == false {
let newBestWidth = CGFloat(bestWidth(for: upcomingEventView.dataObject))
// Let's note if the current width is too small/correct
newWidth += $0.frame.size.width != newBestWidth ? newBestWidth : upcomingEventView.frame.size.width
upcomingEventView.frame = CGRect(x: upcomingEventView.frame.origin.x,
y: upcomingEventView.frame.origin.y,
width: newBestWidth,
height: upcomingEventView.frame.size.height)
}
}

13
Clocker/Preferences/Menu Bar/StatusItemView.swift

@ -3,10 +3,21 @@
import Cocoa
import CoreModelKit
var defaultTimeParagraphStyle: NSMutableParagraphStyle {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
paragraphStyle.lineBreakMode = .byTruncatingTail
return paragraphStyle
}
var defaultParagraphStyle: NSMutableParagraphStyle {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
paragraphStyle.lineBreakMode = .byTruncatingTail
// Better readability for p,q,y,g in the status bar.
let userPreferredLanguage = Locale.preferredLanguages.first ?? "en-US"
let lineHeight = userPreferredLanguage.contains("en") ? 0.92 : 1
paragraphStyle.lineHeightMultiple = CGFloat(lineHeight)
return paragraphStyle
}
@ -50,7 +61,7 @@ class StatusItemView: NSView {
NSAttributedString.Key.font: compactModeTimeFont,
NSAttributedString.Key.foregroundColor: textColor,
NSAttributedString.Key.backgroundColor: NSColor.clear,
NSAttributedString.Key.paragraphStyle: defaultParagraphStyle,
NSAttributedString.Key.paragraphStyle: defaultTimeParagraphStyle,
]
return attributes
}

2
Clocker/Preferences/Menu Bar/UpcomingEventStatusItemView.swift

@ -21,7 +21,7 @@ class UpcomingEventStatusItemView: NSView {
NSAttributedString.Key.font: compactModeTimeFont,
NSAttributedString.Key.foregroundColor: textColor,
NSAttributedString.Key.backgroundColor: NSColor.clear,
NSAttributedString.Key.paragraphStyle: defaultParagraphStyle,
NSAttributedString.Key.paragraphStyle: defaultTimeParagraphStyle,
]
return attributes
}

42
Clocker/Preferences/Preferences.storyboard

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="RHq-9Z-auA">
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="RHq-9Z-auA">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
@ -10,7 +10,7 @@
<scene sceneID="hW4-pb-8TH">
<objects>
<windowController id="RHq-9Z-auA" customClass="OneWindowController" customModule="Clocker" customModuleProvider="target" sceneMemberID="viewController">
<window key="window" title="Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="Juk-wd-881">
<window key="window" title="Settings" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="Juk-wd-881">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="245" y="301" width="480" height="270"/>
@ -488,7 +488,7 @@
<rect key="frame" x="-100" y="-100" width="219" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" controlSize="mini" horizontal="NO" id="1lL-VM-dm3">
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" controlSize="mini" horizontal="NO" id="1lL-VM-dm3" customClass="ThinScroller" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="325" y="1" width="14" height="180"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
@ -984,7 +984,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="111" rowSizeStyle="automatic" viewBased="YES" id="KbJ-p4-i6E">
<rect key="frame" x="0.0" y="0.0" width="412" height="98"/>
<rect key="frame" x="0.0" y="0.0" width="412" height="113"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
@ -1505,7 +1505,7 @@
<windowStyleMask key="styleMask" closable="YES" miniaturizable="YES" nonactivatingPanel="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="120" y="64" width="345" height="320"/>
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="875"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
<value key="minSize" type="size" width="345" height="320"/>
<value key="maxSize" type="size" width="345" height="320"/>
<view key="contentView" misplaced="YES" id="MAe-t5-3A2">
@ -1513,7 +1513,7 @@
<autoresizingMask key="autoresizingMask"/>
<subviews>
<searchField toolTip="Search a timezone" wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Dha-h9-Nd0">
<rect key="frame" x="8" y="97" width="320" height="23"/>
<rect key="frame" x="8" y="73" width="320" 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">
<font key="font" size="13" name="Avenir-Light"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@ -1570,13 +1570,13 @@ DQ
</connections>
</button>
<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="320" height="57"/>
<rect key="frame" x="8" y="30" width="320" height="33"/>
<clipView key="contentView" drawsBackground="NO" id="rGc-3M-cCq">
<rect key="frame" x="0.0" y="0.0" width="320" height="57"/>
<autoresizingMask key="autoresizingMask"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="33"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<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">
<rect key="frame" x="0.0" y="0.0" width="320" height="57"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="64"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
@ -1660,20 +1660,20 @@ DQ
<rect key="frame" x="0.0" y="208" width="329" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="cBF-ds-h2q">
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="cBF-ds-h2q" customClass="ThinScroller" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</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">
<rect key="frame" x="160" y="78" width="16" height="16"/>
<rect key="frame" x="160" y="66" width="16" height="16"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="fgE-77-Vda"/>
<constraint firstAttribute="width" constant="16" id="pwe-em-e0a"/>
</constraints>
</progressIndicator>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xgb-wU-8RU">
<rect key="frame" x="18" y="48" width="300" height="22"/>
<rect key="frame" x="18" y="36" width="300" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="zqt-d8-yas"/>
</constraints>
@ -1721,7 +1721,7 @@ DQ
<rect key="frame" x="0.0" y="484" width="613" height="30"/>
<subviews>
<button toolTip="Sorts by time difference from your current timezone" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="P6d-qq-ycq">
<rect key="frame" x="283" y="3" width="9" height="25"/>
<rect key="frame" x="285" y="3" width="8" height="25"/>
<constraints>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="180" id="cAs-on-f7X"/>
<constraint firstAttribute="height" constant="25" id="juv-QL-vMx"/>
@ -1736,7 +1736,7 @@ DQ
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0HL-uj-s4v">
<rect key="frame" x="331" y="3" width="9" height="25"/>
<rect key="frame" x="331" y="3" width="8" height="25"/>
<constraints>
<constraint firstAttribute="height" constant="25" id="eZL-Gr-38S"/>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="120" id="sJk-T7-7Lm"/>
@ -1751,7 +1751,7 @@ DQ
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6fs-Mx-NcG">
<rect key="frame" x="307" y="3" width="9" height="25"/>
<rect key="frame" x="308" y="3" width="8" height="25"/>
<constraints>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="190" id="241-Rn-G6N"/>
<constraint firstAttribute="height" constant="25" id="weP-ll-vZ8"/>
@ -1782,7 +1782,7 @@ DQ
<scrollView wantsLayer="YES" focusRingType="none" borderType="none" horizontalLineScroll="62" horizontalPageScroll="10" verticalLineScroll="62" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zpF-gE-u0C">
<rect key="frame" x="0.0" y="0.0" width="618" height="412"/>
<clipView key="contentView" drawsBackground="NO" id="vaT-2p-gsy">
<rect key="frame" x="0.0" y="0.0" width="618" height="412"/>
<rect key="frame" x="0.0" y="0.0" width="603" height="412"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" autosaveColumns="NO" rowHeight="60" headerView="1hb-YT-szP" id="p9D-mN-dTa">
@ -1839,8 +1839,8 @@ DQ
<rect key="frame" x="-100" y="-100" width="618" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="lG5-VB-UOe">
<rect key="frame" x="602" y="25" width="16" height="387"/>
<scroller key="verticalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="lG5-VB-UOe" customClass="ThinScroller" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="603" y="25" width="15" height="387"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<tableHeaderView key="headerView" wantsLayer="YES" focusRingType="none" id="1hb-YT-szP">
@ -2010,7 +2010,7 @@ CA
<image name="ClockerIcon-512" width="1024" height="1024"/>
<image name="CurrentLocation" width="350" height="350"/>
<image name="Extra" width="700" height="700"/>
<image name="NSDescendingSortIndicator" width="9" height="9"/>
<image name="NSDescendingSortIndicator" width="8" height="8"/>
<image name="NSInfo" width="32" height="32"/>
<image name="NSPreferencesGeneral" width="32" height="32"/>
<image name="Privacy" width="350" height="350"/>

Loading…
Cancel
Save