From 31dde4b0727fc1ab7507cebab3573b7549447621 Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Fri, 2 Sep 2016 12:31:38 +0400 Subject: [PATCH 01/32] Ignore .DS_Store --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 759c809..ce7c39c 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ src/Pods src/Podfile.lock src/.idea +.DS_Store From c87137039b4e51f0c71042b524faceaccaa0deca Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Fri, 2 Sep 2016 12:35:20 +0400 Subject: [PATCH 02/32] Remove invalid option --- src/Podfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Podfile b/src/Podfile index ff6068c..1dcc53c 100644 --- a/src/Podfile +++ b/src/Podfile @@ -1,6 +1,6 @@ # no pods for main target yet -target :TomightyTests, :exclusive => true do +target :TomightyTests do pod 'OCHamcrest', '~> 3.0' pod 'OCMockito', '~> 1.0' end From 2fabf375f8125db44e4616477d3a52e62222f13c Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Fri, 2 Sep 2016 12:36:00 +0400 Subject: [PATCH 03/32] Add Xcode 7 updates. --- src/Tomighty.xcodeproj/project.pbxproj | 3700 +++++--------------- src/Tomighty/Tomighty-Info.plist | 6 +- src/TomightyTests/TomightyTests-Info.plist | 2 +- 3 files changed, 931 insertions(+), 2777 deletions(-) diff --git a/src/Tomighty.xcodeproj/project.pbxproj b/src/Tomighty.xcodeproj/project.pbxproj index 2f90624..8c4dcdc 100644 --- a/src/Tomighty.xcodeproj/project.pbxproj +++ b/src/Tomighty.xcodeproj/project.pbxproj @@ -1,2773 +1,927 @@ - - - - - archiveVersion - 1 - classes - - objectVersion - 46 - objects - - 0B1A27968CA44FEFB1DA3DB3 - - explicitFileType - archive.ar - includeInIndex - 0 - isa - PBXFileReference - path - libPods-TomightyTests.a - sourceTree - BUILT_PRODUCTS_DIR - - 300AE29018D1444400264309 - - children - - 300AE29118D1444400264309 - - isa - PBXVariantGroup - name - PreferencesWindow.xib - sourceTree - <group> - - 300AE29118D1444400264309 - - isa - PBXFileReference - lastKnownFileType - file.xib - name - Base - path - Base.lproj/PreferencesWindow.xib - sourceTree - <group> - - 300AE29218D1444400264309 - - fileRef - 300AE29018D1444400264309 - isa - PBXBuildFile - - 300AE29318D1471F00264309 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYPreferencesWindowController.h - path - Core/UI/TYPreferencesWindowController.h - sourceTree - <group> - - 300AE29418D1471F00264309 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYPreferencesWindowController.m - path - Core/UI/TYPreferencesWindowController.m - sourceTree - <group> - - 300AE29518D1471F00264309 - - fileRef - 300AE29418D1471F00264309 - isa - PBXBuildFile - - 301A007618BD413400B8DEE0 - - children - - 309ECB0318C3828B00B270BF - 309ECB0118C3828B00B270BF - 309ECB0218C3828B00B270BF - 305D161418CCEE3500CE6A34 - 301A007718BD417200B8DEE0 - 301A007818BD417200B8DEE0 - 301A007B18BD421500B8DEE0 - 30B89F9C18C3855600C1DD2B - 30B89F9D18C3855600C1DD2B - - isa - PBXGroup - name - Timer - sourceTree - <group> - - 301A007718BD417200B8DEE0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYDefaultTimer.h - path - Core/Timer/TYDefaultTimer.h - sourceTree - <group> - - 301A007818BD417200B8DEE0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYDefaultTimer.m - path - Core/Timer/TYDefaultTimer.m - sourceTree - <group> - - 301A007918BD417200B8DEE0 - - fileRef - 301A007818BD417200B8DEE0 - isa - PBXBuildFile - - 301A007B18BD421500B8DEE0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYTimerContext.h - path - Core/Timer/TYTimerContext.h - sourceTree - <group> - - 3025AE5018D35AA000BC4207 - - children - - 3025AE5118D35B2B00BC4207 - 3025AE5218D35B2B00BC4207 - 3025AE5318D35B2B00BC4207 - 3025AE5418D35B2B00BC4207 - - isa - PBXGroup - name - Agent - sourceTree - <group> - - 3025AE5118D35B2B00BC4207 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYSoundAgent.h - path - Core/Agent/TYSoundAgent.h - sourceTree - <group> - - 3025AE5218D35B2B00BC4207 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYSoundAgent.m - path - Core/Agent/TYSoundAgent.m - sourceTree - <group> - - 3025AE5318D35B2B00BC4207 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYUserInterfaceAgent.h - path - Core/Agent/TYUserInterfaceAgent.h - sourceTree - <group> - - 3025AE5418D35B2B00BC4207 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYUserInterfaceAgent.m - path - Core/Agent/TYUserInterfaceAgent.m - sourceTree - <group> - - 3025AE5518D35B2B00BC4207 - - fileRef - 3025AE5218D35B2B00BC4207 - isa - PBXBuildFile - - 3025AE5618D35B2B00BC4207 - - fileRef - 3025AE5418D35B2B00BC4207 - isa - PBXBuildFile - - 3025AE5718D35B3700BC4207 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYSyntheticEventPublisher.h - path - Core/Event/TYSyntheticEventPublisher.h - sourceTree - <group> - - 3025AE5818D35B3700BC4207 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYSyntheticEventPublisher.m - path - Core/Event/TYSyntheticEventPublisher.m - sourceTree - <group> - - 3025AE5918D35B3700BC4207 - - fileRef - 3025AE5818D35B3700BC4207 - isa - PBXBuildFile - - 3025AE5A18D35BAB00BC4207 - - children - - 3025AE5B18D35C0D00BC4207 - 3025AE5C18D35C0D00BC4207 - - isa - PBXGroup - name - Agent - sourceTree - <group> - - 3025AE5B18D35C0D00BC4207 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYSoundAgentTests.m - path - Core/Agent/TYSoundAgentTests.m - sourceTree - <group> - - 3025AE5C18D35C0D00BC4207 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYUserInterfaceAgentTests.m - path - Core/Agent/TYUserInterfaceAgentTests.m - sourceTree - <group> - - 3025AE5D18D35C0D00BC4207 - - fileRef - 3025AE5B18D35C0D00BC4207 - isa - PBXBuildFile - - 3025AE5E18D35C0D00BC4207 - - fileRef - 3025AE5C18D35C0D00BC4207 - isa - PBXBuildFile - - 3025AE5F18D35C1700BC4207 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYSyntheticEventPublisherTests.m - path - Core/Event/TYSyntheticEventPublisherTests.m - sourceTree - <group> - - 3025AE6018D35C1700BC4207 - - fileRef - 3025AE5F18D35C1700BC4207 - isa - PBXBuildFile - - 3032EEE118C6AF2C00070BD2 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYDefaultSoundPlayer.h - path - Core/Sound/TYDefaultSoundPlayer.h - sourceTree - <group> - - 3032EEE218C6AF2C00070BD2 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYDefaultSoundPlayer.m - path - Core/Sound/TYDefaultSoundPlayer.m - sourceTree - <group> - - 3032EEE318C6AF2C00070BD2 - - fileRef - 3032EEE218C6AF2C00070BD2 - isa - PBXBuildFile - - 3032EEEB18C6C28700070BD2 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYPublishedEvent.h - path - Mock/TYPublishedEvent.h - sourceTree - <group> - - 3032EEEC18C6C28700070BD2 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYPublishedEvent.m - path - Mock/TYPublishedEvent.m - sourceTree - <group> - - 3032EEED18C6C28700070BD2 - - fileRef - 3032EEEC18C6C28700070BD2 - isa - PBXBuildFile - - 3039D2F118C4DF47008689C9 - - children - - 3025AE5718D35B3700BC4207 - 3025AE5818D35B3700BC4207 - 3039D2F418C4DF7C008689C9 - 3039D2F218C4DF7C008689C9 - 3039D2F318C4DF7C008689C9 - - isa - PBXGroup - name - Event - sourceTree - <group> - - 3039D2F218C4DF7C008689C9 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYDefaultEventBus.h - path - Core/Event/TYDefaultEventBus.h - sourceTree - <group> - - 3039D2F318C4DF7C008689C9 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYDefaultEventBus.m - path - Core/Event/TYDefaultEventBus.m - sourceTree - <group> - - 3039D2F418C4DF7C008689C9 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYEventBus.h - path - Core/Event/TYEventBus.h - sourceTree - <group> - - 3039D2F518C4DF7C008689C9 - - fileRef - 3039D2F318C4DF7C008689C9 - isa - PBXBuildFile - - 3039D2F618C4DFB0008689C9 - - children - - 3039D2F718C4DFCE008689C9 - 3025AE5F18D35C1700BC4207 - - isa - PBXGroup - name - Event - sourceTree - <group> - - 3039D2F718C4DFCE008689C9 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYEventBusTests.m - path - Core/Event/TYEventBusTests.m - sourceTree - <group> - - 3039D2F818C4DFCE008689C9 - - fileRef - 3039D2F718C4DFCE008689C9 - isa - PBXBuildFile - - 30415FAC18C5105D0069FAE3 - - children - - 30415FAD18C5109D0069FAE3 - - isa - PBXGroup - name - Preferences - sourceTree - <group> - - 30415FAD18C5109D0069FAE3 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYPreferencesTests.m - path - Core/Preferences/TYPreferencesTests.m - sourceTree - <group> - - 30415FAE18C5109D0069FAE3 - - fileRef - 30415FAD18C5109D0069FAE3 - isa - PBXBuildFile - - 30415FAF18C51B4D0069FAE3 - - children - - 30415FB018C51B6A0069FAE3 - 30415FB418C51C290069FAE3 - 30415FB518C51C290069FAE3 - - isa - PBXGroup - name - Preferences - sourceTree - <group> - - 30415FB018C51B6A0069FAE3 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYPreferences.h - path - Core/Preferences/TYPreferences.h - sourceTree - <group> - - 30415FB418C51C290069FAE3 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYUserDefaultsPreferences.h - path - Core/Preferences/TYUserDefaultsPreferences.h - sourceTree - <group> - - 30415FB518C51C290069FAE3 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYUserDefaultsPreferences.m - path - Core/Preferences/TYUserDefaultsPreferences.m - sourceTree - <group> - - 30415FB618C51C290069FAE3 - - fileRef - 30415FB518C51C290069FAE3 - isa - PBXBuildFile - - 304AF80918BD04BE00A2EA74 - - children - - 305D161D18CD13F100CE6A34 - 305D161A18CD12FA00CE6A34 - 30C383D318CFCA3700FABFFE - 304AF81B18BD04BE00A2EA74 - 304AF83918BD04BF00A2EA74 - 304AF81418BD04BE00A2EA74 - 304AF81318BD04BE00A2EA74 - 448B4AF8B231E32919AFF1BF - - isa - PBXGroup - sourceTree - <group> - - 304AF80A18BD04BE00A2EA74 - - attributes - - CLASSPREFIX - TY - LastUpgradeCheck - 0500 - ORGANIZATIONNAME - Gig Software - TargetAttributes - - 304AF83218BD04BE00A2EA74 - - TestTargetID - 304AF81118BD04BE00A2EA74 - - - - buildConfigurationList - 304AF80D18BD04BE00A2EA74 - compatibilityVersion - Xcode 3.2 - developmentRegion - English - hasScannedForEncodings - 0 - isa - PBXProject - knownRegions - - en - Base - - mainGroup - 304AF80918BD04BE00A2EA74 - productRefGroup - 304AF81318BD04BE00A2EA74 - projectDirPath - - projectReferences - - projectRoot - - targets - - 304AF81118BD04BE00A2EA74 - 304AF83218BD04BE00A2EA74 - - - 304AF80D18BD04BE00A2EA74 - - buildConfigurations - - 304AF84118BD04BF00A2EA74 - 304AF84218BD04BF00A2EA74 - - defaultConfigurationIsVisible - 0 - defaultConfigurationName - Release - isa - XCConfigurationList - - 304AF80E18BD04BE00A2EA74 - - buildActionMask - 2147483647 - files - - 304AF82218BD04BE00A2EA74 - 30B89F9E18C3855600C1DD2B - 3025AE5518D35B2B00BC4207 - 309ECB0418C3828B00B270BF - 3032EEE318C6AF2C00070BD2 - 300AE29518D1471F00264309 - 30DB72FA18CD54D200293915 - 301A007918BD417200B8DEE0 - 309394E718D0C76100D6C71A - 30C383E018CFE02100FABFFE - 30415FB618C51C290069FAE3 - 3039D2F518C4DF7C008689C9 - 309394EA18D0CBEC00D6C71A - 3025AE5618D35B2B00BC4207 - 3025AE5918D35B3700BC4207 - 304AF82918BD04BE00A2EA74 - - isa - PBXSourcesBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 304AF80F18BD04BE00A2EA74 - - buildActionMask - 2147483647 - files - - 304AF81618BD04BE00A2EA74 - - isa - PBXFrameworksBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 304AF81018BD04BE00A2EA74 - - buildActionMask - 2147483647 - files - - 30C383D918CFCA6B00FABFFE - 30C383CE18CFC9FC00FABFFE - 304AF82018BD04BE00A2EA74 - 305D161E18CD13F100CE6A34 - 30C383CF18CFC9FC00FABFFE - 30C383D718CFCA6B00FABFFE - 304AF82E18BD04BE00A2EA74 - 30C383CC18CFC9FC00FABFFE - 30C383D118CFC9FC00FABFFE - 30C383D218CFC9FC00FABFFE - 30C383CD18CFC9FC00FABFFE - 30C383C918CFC9FC00FABFFE - 30C383CB18CFC9FC00FABFFE - 30C383D018CFC9FC00FABFFE - 30C383CA18CFC9FC00FABFFE - 300AE29218D1444400264309 - 304AF82618BD04BE00A2EA74 - 30C383D818CFCA6B00FABFFE - 304AF82C18BD04BE00A2EA74 - - isa - PBXResourcesBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 304AF81118BD04BE00A2EA74 - - buildConfigurationList - 304AF84318BD04BF00A2EA74 - buildPhases - - 304AF80E18BD04BE00A2EA74 - 304AF80F18BD04BE00A2EA74 - 304AF81018BD04BE00A2EA74 - - buildRules - - dependencies - - isa - PBXNativeTarget - name - Tomighty - productName - Tomighty - productReference - 304AF81218BD04BE00A2EA74 - productType - com.apple.product-type.application - - 304AF81218BD04BE00A2EA74 - - explicitFileType - wrapper.application - includeInIndex - 0 - isa - PBXFileReference - path - Tomighty.app - sourceTree - BUILT_PRODUCTS_DIR - - 304AF81318BD04BE00A2EA74 - - children - - 304AF81218BD04BE00A2EA74 - 304AF83318BD04BE00A2EA74 - - isa - PBXGroup - name - Products - sourceTree - <group> - - 304AF81418BD04BE00A2EA74 - - children - - 0B1A27968CA44FEFB1DA3DB3 - 304AF81518BD04BE00A2EA74 - 304AF83418BD04BE00A2EA74 - 304AF81718BD04BE00A2EA74 - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - 304AF81518BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - Cocoa.framework - path - System/Library/Frameworks/Cocoa.framework - sourceTree - SDKROOT - - 304AF81618BD04BE00A2EA74 - - fileRef - 304AF81518BD04BE00A2EA74 - isa - PBXBuildFile - - 304AF81718BD04BE00A2EA74 - - children - - 304AF81818BD04BE00A2EA74 - 304AF81918BD04BE00A2EA74 - 304AF81A18BD04BE00A2EA74 - - isa - PBXGroup - name - Other Frameworks - sourceTree - <group> - - 304AF81818BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - AppKit.framework - path - System/Library/Frameworks/AppKit.framework - sourceTree - SDKROOT - - 304AF81918BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - CoreData.framework - path - System/Library/Frameworks/CoreData.framework - sourceTree - SDKROOT - - 304AF81A18BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - Foundation.framework - path - System/Library/Frameworks/Foundation.framework - sourceTree - SDKROOT - - 304AF81B18BD04BE00A2EA74 - - children - - 304AF84918BD117200A2EA74 - 304AF82718BD04BE00A2EA74 - 304AF82818BD04BE00A2EA74 - 304AF82A18BD04BE00A2EA74 - 300AE29018D1444400264309 - 304AF82D18BD04BE00A2EA74 - 304AF81C18BD04BE00A2EA74 - - isa - PBXGroup - path - Tomighty - sourceTree - <group> - - 304AF81C18BD04BE00A2EA74 - - children - - 304AF81D18BD04BE00A2EA74 - 304AF81E18BD04BE00A2EA74 - 304AF82118BD04BE00A2EA74 - 304AF82318BD04BE00A2EA74 - 304AF82418BD04BE00A2EA74 - - isa - PBXGroup - name - Supporting Files - sourceTree - <group> - - 304AF81D18BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - text.plist.xml - path - Tomighty-Info.plist - sourceTree - <group> - - 304AF81E18BD04BE00A2EA74 - - children - - 304AF81F18BD04BE00A2EA74 - - isa - PBXVariantGroup - name - InfoPlist.strings - sourceTree - <group> - - 304AF81F18BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - text.plist.strings - name - en - path - en.lproj/InfoPlist.strings - sourceTree - <group> - - 304AF82018BD04BE00A2EA74 - - fileRef - 304AF81E18BD04BE00A2EA74 - isa - PBXBuildFile - - 304AF82118BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - main.m - sourceTree - <group> - - 304AF82218BD04BE00A2EA74 - - fileRef - 304AF82118BD04BE00A2EA74 - isa - PBXBuildFile - - 304AF82318BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - Tomighty-Prefix.pch - sourceTree - <group> - - 304AF82418BD04BE00A2EA74 - - children - - 304AF82518BD04BE00A2EA74 - - isa - PBXVariantGroup - name - Credits.rtf - sourceTree - <group> - - 304AF82518BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - text.rtf - name - en - path - en.lproj/Credits.rtf - sourceTree - <group> - - 304AF82618BD04BE00A2EA74 - - fileRef - 304AF82418BD04BE00A2EA74 - isa - PBXBuildFile - - 304AF82718BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - TYAppDelegate.h - sourceTree - <group> - - 304AF82818BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - TYAppDelegate.m - sourceTree - <group> - - 304AF82918BD04BE00A2EA74 - - fileRef - 304AF82818BD04BE00A2EA74 - isa - PBXBuildFile - - 304AF82A18BD04BE00A2EA74 - - children - - 304AF82B18BD04BE00A2EA74 - - isa - PBXVariantGroup - name - MainMenu.xib - sourceTree - <group> - - 304AF82B18BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - file.xib - name - Base - path - Base.lproj/MainMenu.xib - sourceTree - <group> - - 304AF82C18BD04BE00A2EA74 - - fileRef - 304AF82A18BD04BE00A2EA74 - isa - PBXBuildFile - - 304AF82D18BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - folder.assetcatalog - path - Images.xcassets - sourceTree - <group> - - 304AF82E18BD04BE00A2EA74 - - fileRef - 304AF82D18BD04BE00A2EA74 - isa - PBXBuildFile - - 304AF82F18BD04BE00A2EA74 - - buildActionMask - 2147483647 - files - - 30DB72F618CD4FC800293915 - 309ECB0818C382CF00B270BF - 3039D2F818C4DFCE008689C9 - 3025AE6018D35C1700BC4207 - 309ECAFD18C36F6300B270BF - 309ECB0A18C3830B00B270BF - 3025AE5D18D35C0D00BC4207 - 3032EEED18C6C28700070BD2 - 30CFBF1218BD76F7000266B4 - 30C383DC18CFDE8F00FABFFE - 3025AE5E18D35C0D00BC4207 - 30BD314318C556EE00428B1E - 30415FAE18C5109D0069FAE3 - - isa - PBXSourcesBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 304AF83018BD04BE00A2EA74 - - buildActionMask - 2147483647 - files - - 304AF83618BD04BF00A2EA74 - 304AF83518BD04BF00A2EA74 - 88742E1C44894488BB0F167C - - isa - PBXFrameworksBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 304AF83118BD04BE00A2EA74 - - buildActionMask - 2147483647 - files - - 304AF83E18BD04BF00A2EA74 - - isa - PBXResourcesBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 304AF83218BD04BE00A2EA74 - - buildConfigurationList - 304AF84618BD04BF00A2EA74 - buildPhases - - B7B8607396F24F888FD9E51D - 304AF82F18BD04BE00A2EA74 - 304AF83018BD04BE00A2EA74 - 304AF83118BD04BE00A2EA74 - 30CFBF0718BD45BF000266B4 - 94D0AC8D9A87412895298800 - 9824E2BC220CB543E2CD32C4 - - buildRules - - dependencies - - 304AF83818BD04BF00A2EA74 - - isa - PBXNativeTarget - name - TomightyTests - productName - TomightyTests - productReference - 304AF83318BD04BE00A2EA74 - productType - com.apple.product-type.bundle.unit-test - - 304AF83318BD04BE00A2EA74 - - explicitFileType - wrapper.cfbundle - includeInIndex - 0 - isa - PBXFileReference - path - TomightyTests.xctest - sourceTree - BUILT_PRODUCTS_DIR - - 304AF83418BD04BE00A2EA74 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - XCTest.framework - path - Library/Frameworks/XCTest.framework - sourceTree - DEVELOPER_DIR - - 304AF83518BD04BF00A2EA74 - - fileRef - 304AF83418BD04BE00A2EA74 - isa - PBXBuildFile - - 304AF83618BD04BF00A2EA74 - - fileRef - 304AF81518BD04BE00A2EA74 - isa - PBXBuildFile - - 304AF83718BD04BF00A2EA74 - - containerPortal - 304AF80A18BD04BE00A2EA74 - isa - PBXContainerItemProxy - proxyType - 1 - remoteGlobalIDString - 304AF81118BD04BE00A2EA74 - remoteInfo - Tomighty - - 304AF83818BD04BF00A2EA74 - - isa - PBXTargetDependency - target - 304AF81118BD04BE00A2EA74 - targetProxy - 304AF83718BD04BF00A2EA74 - - 304AF83918BD04BF00A2EA74 - - children - - 309ECB0518C3829700B270BF - 304AF83A18BD04BF00A2EA74 - 30CFBF1318BD76FC000266B4 - - isa - PBXGroup - path - TomightyTests - sourceTree - <group> - - 304AF83A18BD04BF00A2EA74 - - children - - 304AF83B18BD04BF00A2EA74 - 304AF83C18BD04BF00A2EA74 - - isa - PBXGroup - name - Supporting Files - sourceTree - <group> - - 304AF83B18BD04BF00A2EA74 - - isa - PBXFileReference - lastKnownFileType - text.plist.xml - path - TomightyTests-Info.plist - sourceTree - <group> - - 304AF83C18BD04BF00A2EA74 - - children - - 304AF83D18BD04BF00A2EA74 - - isa - PBXVariantGroup - name - InfoPlist.strings - sourceTree - <group> - - 304AF83D18BD04BF00A2EA74 - - isa - PBXFileReference - lastKnownFileType - text.plist.strings - name - en - path - en.lproj/InfoPlist.strings - sourceTree - <group> - - 304AF83E18BD04BF00A2EA74 - - fileRef - 304AF83C18BD04BF00A2EA74 - isa - PBXBuildFile - - 304AF84118BD04BF00A2EA74 - - buildSettings - - ALWAYS_SEARCH_USER_PATHS - NO - CLANG_CXX_LANGUAGE_STANDARD - gnu++0x - CLANG_CXX_LIBRARY - libc++ - CLANG_ENABLE_OBJC_ARC - YES - CLANG_WARN_BOOL_CONVERSION - YES - CLANG_WARN_CONSTANT_CONVERSION - YES - CLANG_WARN_DIRECT_OBJC_ISA_USAGE - YES_ERROR - CLANG_WARN_EMPTY_BODY - YES - CLANG_WARN_ENUM_CONVERSION - YES - CLANG_WARN_INT_CONVERSION - YES - CLANG_WARN_OBJC_ROOT_CLASS - YES_ERROR - CLANG_WARN__DUPLICATE_METHOD_MATCH - YES - COPY_PHASE_STRIP - NO - GCC_C_LANGUAGE_STANDARD - gnu99 - GCC_DYNAMIC_NO_PIC - NO - GCC_ENABLE_OBJC_EXCEPTIONS - YES - GCC_OPTIMIZATION_LEVEL - 0 - GCC_PREPROCESSOR_DEFINITIONS - - DEBUG=1 - $(inherited) - - GCC_SYMBOLS_PRIVATE_EXTERN - NO - GCC_WARN_64_TO_32_BIT_CONVERSION - YES - GCC_WARN_ABOUT_RETURN_TYPE - YES_ERROR - GCC_WARN_UNDECLARED_SELECTOR - YES - GCC_WARN_UNINITIALIZED_AUTOS - YES - GCC_WARN_UNUSED_FUNCTION - YES - GCC_WARN_UNUSED_VARIABLE - YES - MACOSX_DEPLOYMENT_TARGET - 10.9 - ONLY_ACTIVE_ARCH - YES - SDKROOT - macosx - - isa - XCBuildConfiguration - name - Debug - - 304AF84218BD04BF00A2EA74 - - buildSettings - - ALWAYS_SEARCH_USER_PATHS - NO - CLANG_CXX_LANGUAGE_STANDARD - gnu++0x - CLANG_CXX_LIBRARY - libc++ - CLANG_ENABLE_OBJC_ARC - YES - CLANG_WARN_BOOL_CONVERSION - YES - CLANG_WARN_CONSTANT_CONVERSION - YES - CLANG_WARN_DIRECT_OBJC_ISA_USAGE - YES_ERROR - CLANG_WARN_EMPTY_BODY - YES - CLANG_WARN_ENUM_CONVERSION - YES - CLANG_WARN_INT_CONVERSION - YES - CLANG_WARN_OBJC_ROOT_CLASS - YES_ERROR - CLANG_WARN__DUPLICATE_METHOD_MATCH - YES - COPY_PHASE_STRIP - YES - DEBUG_INFORMATION_FORMAT - dwarf-with-dsym - ENABLE_NS_ASSERTIONS - NO - GCC_C_LANGUAGE_STANDARD - gnu99 - GCC_ENABLE_OBJC_EXCEPTIONS - YES - GCC_WARN_64_TO_32_BIT_CONVERSION - YES - GCC_WARN_ABOUT_RETURN_TYPE - YES_ERROR - GCC_WARN_UNDECLARED_SELECTOR - YES - GCC_WARN_UNINITIALIZED_AUTOS - YES - GCC_WARN_UNUSED_FUNCTION - YES - GCC_WARN_UNUSED_VARIABLE - YES - MACOSX_DEPLOYMENT_TARGET - 10.9 - SDKROOT - macosx - - isa - XCBuildConfiguration - name - Release - - 304AF84318BD04BF00A2EA74 - - buildConfigurations - - 304AF84418BD04BF00A2EA74 - 304AF84518BD04BF00A2EA74 - - defaultConfigurationIsVisible - 0 - defaultConfigurationName - Release - isa - XCConfigurationList - - 304AF84418BD04BF00A2EA74 - - buildSettings - - COMBINE_HIDPI_IMAGES - YES - GCC_PRECOMPILE_PREFIX_HEADER - YES - GCC_PREFIX_HEADER - Tomighty/Tomighty-Prefix.pch - INFOPLIST_FILE - Tomighty/Tomighty-Info.plist - PRODUCT_NAME - $(TARGET_NAME) - WRAPPER_EXTENSION - app - - isa - XCBuildConfiguration - name - Debug - - 304AF84518BD04BF00A2EA74 - - buildSettings - - COMBINE_HIDPI_IMAGES - YES - GCC_PRECOMPILE_PREFIX_HEADER - YES - GCC_PREFIX_HEADER - Tomighty/Tomighty-Prefix.pch - INFOPLIST_FILE - Tomighty/Tomighty-Info.plist - PRODUCT_NAME - $(TARGET_NAME) - WRAPPER_EXTENSION - app - - isa - XCBuildConfiguration - name - Release - - 304AF84618BD04BF00A2EA74 - - buildConfigurations - - 304AF84718BD04BF00A2EA74 - 304AF84818BD04BF00A2EA74 - - defaultConfigurationIsVisible - 0 - defaultConfigurationName - Release - isa - XCConfigurationList - - 304AF84718BD04BF00A2EA74 - - baseConfigurationReference - 4E46E0E26D22DDAFC599CB28 - buildSettings - - BUNDLE_LOADER - $(BUILT_PRODUCTS_DIR)/Tomighty.app/Contents/MacOS/Tomighty - COMBINE_HIDPI_IMAGES - YES - FRAMEWORK_SEARCH_PATHS - - $(DEVELOPER_FRAMEWORKS_DIR) - $(inherited) - $(PROJECT_DIR) - - GCC_PRECOMPILE_PREFIX_HEADER - YES - GCC_PREFIX_HEADER - Tomighty/Tomighty-Prefix.pch - GCC_PREPROCESSOR_DEFINITIONS - - DEBUG=1 - $(inherited) - - INFOPLIST_FILE - TomightyTests/TomightyTests-Info.plist - PRODUCT_NAME - $(TARGET_NAME) - TEST_HOST - $(BUNDLE_LOADER) - WRAPPER_EXTENSION - xctest - - isa - XCBuildConfiguration - name - Debug - - 304AF84818BD04BF00A2EA74 - - baseConfigurationReference - 9C134136195EF68DBA17C261 - buildSettings - - BUNDLE_LOADER - $(BUILT_PRODUCTS_DIR)/Tomighty.app/Contents/MacOS/Tomighty - COMBINE_HIDPI_IMAGES - YES - FRAMEWORK_SEARCH_PATHS - - $(DEVELOPER_FRAMEWORKS_DIR) - $(inherited) - $(PROJECT_DIR) - - GCC_PRECOMPILE_PREFIX_HEADER - YES - GCC_PREFIX_HEADER - Tomighty/Tomighty-Prefix.pch - INFOPLIST_FILE - TomightyTests/TomightyTests-Info.plist - PRODUCT_NAME - $(TARGET_NAME) - TEST_HOST - $(BUNDLE_LOADER) - WRAPPER_EXTENSION - xctest - - isa - XCBuildConfiguration - name - Release - - 304AF84918BD117200A2EA74 - - children - - 3025AE5018D35AA000BC4207 - 3039D2F118C4DF47008689C9 - 30415FAF18C51B4D0069FAE3 - 30BD314718C566B400428B1E - 301A007618BD413400B8DEE0 - 305D161518CD029F00CE6A34 - 30DB72F718CD54C000293915 - 30DB72F818CD54D200293915 - 30DB72F918CD54D200293915 - - isa - PBXGroup - name - Core - sourceTree - <group> - - 305D161418CCEE3500CE6A34 - - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYTimer.h - path - Core/Timer/TYTimer.h - sourceTree - <group> - - 305D161518CD029F00CE6A34 - - children - - 305D161618CD02E100CE6A34 - 30C383DE18CFE02100FABFFE - 30C383DF18CFE02100FABFFE - 30C383DD18CFDFF000FABFFE - 30C383E118CFE34700FABFFE - 309394E518D0C76100D6C71A - 309394E618D0C76100D6C71A - 309394E818D0CBEC00D6C71A - 309394E918D0CBEC00D6C71A - 300AE29318D1471F00264309 - 300AE29418D1471F00264309 - - isa - PBXGroup - name - UI - sourceTree - <group> - - 305D161618CD02E100CE6A34 - - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYAppUI.h - path - Core/UI/TYAppUI.h - sourceTree - <group> - - 305D161A18CD12FA00CE6A34 - - children - - 30C383BF18CFC9FC00FABFFE - 30C383C018CFC9FC00FABFFE - 30C383C118CFC9FC00FABFFE - 30C383C218CFC9FC00FABFFE - 30C383C318CFC9FC00FABFFE - 30C383C418CFC9FC00FABFFE - 30C383C518CFC9FC00FABFFE - 30C383C618CFC9FC00FABFFE - 30C383C718CFC9FC00FABFFE - 30C383C818CFC9FC00FABFFE - - isa - PBXGroup - name - Icons - path - Tomighty - sourceTree - <group> - - 305D161D18CD13F100CE6A34 - - isa - PBXFileReference - lastKnownFileType - image.icns - path - tomighty.icns - sourceTree - <group> - - 305D161E18CD13F100CE6A34 - - fileRef - 305D161D18CD13F100CE6A34 - isa - PBXBuildFile - - 309394E518D0C76100D6C71A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYDefaultStatusIcon.h - path - Core/UI/TYDefaultStatusIcon.h - sourceTree - <group> - - 309394E618D0C76100D6C71A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYDefaultStatusIcon.m - path - Core/UI/TYDefaultStatusIcon.m - sourceTree - <group> - - 309394E718D0C76100D6C71A - - fileRef - 309394E618D0C76100D6C71A - isa - PBXBuildFile - - 309394E818D0CBEC00D6C71A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYImageLoader.h - path - Core/UI/TYImageLoader.h - sourceTree - <group> - - 309394E918D0CBEC00D6C71A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYImageLoader.m - path - Core/UI/TYImageLoader.m - sourceTree - <group> - - 309394EA18D0CBEC00D6C71A - - fileRef - 309394E918D0CBEC00D6C71A - isa - PBXBuildFile - - 309ECAFB18C36F6300B270BF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYMockTimerContext.h - path - Mock/TYMockTimerContext.h - sourceTree - <group> - - 309ECAFC18C36F6300B270BF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYMockTimerContext.m - path - Mock/TYMockTimerContext.m - sourceTree - <group> - - 309ECAFD18C36F6300B270BF - - fileRef - 309ECAFC18C36F6300B270BF - isa - PBXBuildFile - - 309ECB0118C3828B00B270BF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYDefaultSystemTimer.h - path - Core/Timer/TYDefaultSystemTimer.h - sourceTree - <group> - - 309ECB0218C3828B00B270BF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYDefaultSystemTimer.m - path - Core/Timer/TYDefaultSystemTimer.m - sourceTree - <group> - - 309ECB0318C3828B00B270BF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYSystemTimer.h - path - Core/Timer/TYSystemTimer.h - sourceTree - <group> - - 309ECB0418C3828B00B270BF - - fileRef - 309ECB0218C3828B00B270BF - isa - PBXBuildFile - - 309ECB0518C3829700B270BF - - children - - 3025AE5A18D35BAB00BC4207 - 3039D2F618C4DFB0008689C9 - 30415FAC18C5105D0069FAE3 - 309ECB0618C3829F00B270BF - 30C383DA18CFDE6D00FABFFE - 30DB72F518CD4FC800293915 - - isa - PBXGroup - name - Core - sourceTree - <group> - - 309ECB0618C3829F00B270BF - - children - - 309ECB0718C382CF00B270BF - 309ECB0918C3830B00B270BF - - isa - PBXGroup - name - Timer - sourceTree - <group> - - 309ECB0718C382CF00B270BF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYTimerTests.m - path - Core/Timer/TYTimerTests.m - sourceTree - <group> - - 309ECB0818C382CF00B270BF - - fileRef - 309ECB0718C382CF00B270BF - isa - PBXBuildFile - - 309ECB0918C3830B00B270BF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYTimerContextTests.m - path - Core/Timer/TYTimerContextTests.m - sourceTree - <group> - - 309ECB0A18C3830B00B270BF - - fileRef - 309ECB0918C3830B00B270BF - isa - PBXBuildFile - - 30B89F9C18C3855600C1DD2B - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYDefaultTimerContext.h - path - Core/Timer/TYDefaultTimerContext.h - sourceTree - <group> - - 30B89F9D18C3855600C1DD2B - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYDefaultTimerContext.m - path - Core/Timer/TYDefaultTimerContext.m - sourceTree - <group> - - 30B89F9E18C3855600C1DD2B - - fileRef - 30B89F9D18C3855600C1DD2B - isa - PBXBuildFile - - 30BD314118C556EE00428B1E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYMockEventBus.h - path - Mock/TYMockEventBus.h - sourceTree - <group> - - 30BD314218C556EE00428B1E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYMockEventBus.m - path - Mock/TYMockEventBus.m - sourceTree - <group> - - 30BD314318C556EE00428B1E - - fileRef - 30BD314218C556EE00428B1E - isa - PBXBuildFile - - 30BD314718C566B400428B1E - - children - - 30BD314B18C5686500428B1E - 3032EEE118C6AF2C00070BD2 - 3032EEE218C6AF2C00070BD2 - - isa - PBXGroup - name - Sound - sourceTree - <group> - - 30BD314B18C5686500428B1E - - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYSoundPlayer.h - path - Core/Sound/TYSoundPlayer.h - sourceTree - <group> - - 30C383BF18CFC9FC00FABFFE - - isa - PBXFileReference - lastKnownFileType - image.tiff - name - icon-clock.tiff - path - Icons/icon-clock.tiff - sourceTree - SOURCE_ROOT - - 30C383C018CFC9FC00FABFFE - - isa - PBXFileReference - lastKnownFileType - image.tiff - name - icon-start-long-break.tiff - path - Icons/icon-start-long-break.tiff - sourceTree - SOURCE_ROOT - - 30C383C118CFC9FC00FABFFE - - isa - PBXFileReference - lastKnownFileType - image.tiff - name - icon-start-pomodoro.tiff - path - Icons/icon-start-pomodoro.tiff - sourceTree - SOURCE_ROOT - - 30C383C218CFC9FC00FABFFE - - isa - PBXFileReference - lastKnownFileType - image.tiff - name - icon-start-short-break.tiff - path - Icons/icon-start-short-break.tiff - sourceTree - SOURCE_ROOT - - 30C383C318CFC9FC00FABFFE - - isa - PBXFileReference - lastKnownFileType - image.tiff - name - icon-status-long-break.tiff - path - Icons/icon-status-long-break.tiff - sourceTree - SOURCE_ROOT - - 30C383C418CFC9FC00FABFFE - - isa - PBXFileReference - lastKnownFileType - image.tiff - name - icon-status-idle.tiff - path - Icons/icon-status-idle.tiff - sourceTree - SOURCE_ROOT - - 30C383C518CFC9FC00FABFFE - - isa - PBXFileReference - lastKnownFileType - image.tiff - name - icon-status-pomodoro.tiff - path - Icons/icon-status-pomodoro.tiff - sourceTree - SOURCE_ROOT - - 30C383C618CFC9FC00FABFFE - - isa - PBXFileReference - lastKnownFileType - image.tiff - name - icon-status-short-break.tiff - path - Icons/icon-status-short-break.tiff - sourceTree - SOURCE_ROOT - - 30C383C718CFC9FC00FABFFE - - isa - PBXFileReference - lastKnownFileType - image.tiff - name - icon-status-alternate.tiff - path - Icons/icon-status-alternate.tiff - sourceTree - SOURCE_ROOT - - 30C383C818CFC9FC00FABFFE - - isa - PBXFileReference - lastKnownFileType - image.tiff - name - icon-stop-timer.tiff - path - Icons/icon-stop-timer.tiff - sourceTree - SOURCE_ROOT - - 30C383C918CFC9FC00FABFFE - - fileRef - 30C383BF18CFC9FC00FABFFE - isa - PBXBuildFile - - 30C383CA18CFC9FC00FABFFE - - fileRef - 30C383C018CFC9FC00FABFFE - isa - PBXBuildFile - - 30C383CB18CFC9FC00FABFFE - - fileRef - 30C383C118CFC9FC00FABFFE - isa - PBXBuildFile - - 30C383CC18CFC9FC00FABFFE - - fileRef - 30C383C218CFC9FC00FABFFE - isa - PBXBuildFile - - 30C383CD18CFC9FC00FABFFE - - fileRef - 30C383C318CFC9FC00FABFFE - isa - PBXBuildFile - - 30C383CE18CFC9FC00FABFFE - - fileRef - 30C383C418CFC9FC00FABFFE - isa - PBXBuildFile - - 30C383CF18CFC9FC00FABFFE - - fileRef - 30C383C518CFC9FC00FABFFE - isa - PBXBuildFile - - 30C383D018CFC9FC00FABFFE - - fileRef - 30C383C618CFC9FC00FABFFE - isa - PBXBuildFile - - 30C383D118CFC9FC00FABFFE - - fileRef - 30C383C718CFC9FC00FABFFE - isa - PBXBuildFile - - 30C383D218CFC9FC00FABFFE - - fileRef - 30C383C818CFC9FC00FABFFE - isa - PBXBuildFile - - 30C383D318CFCA3700FABFFE - - children - - 30C383D418CFCA6B00FABFFE - 30C383D518CFCA6B00FABFFE - 30C383D618CFCA6B00FABFFE - - isa - PBXGroup - name - Sound - path - Tomighty - sourceTree - <group> - - 30C383D418CFCA6B00FABFFE - - isa - PBXFileReference - lastKnownFileType - audio.wav - name - timer_start.wav - path - Sound/timer_start.wav - sourceTree - SOURCE_ROOT - - 30C383D518CFCA6B00FABFFE - - isa - PBXFileReference - lastKnownFileType - audio.wav - name - timer_goes_off.wav - path - Sound/timer_goes_off.wav - sourceTree - SOURCE_ROOT - - 30C383D618CFCA6B00FABFFE - - isa - PBXFileReference - lastKnownFileType - audio.wav - name - timer_tick.wav - path - Sound/timer_tick.wav - sourceTree - SOURCE_ROOT - - 30C383D718CFCA6B00FABFFE - - fileRef - 30C383D418CFCA6B00FABFFE - isa - PBXBuildFile - - 30C383D818CFCA6B00FABFFE - - fileRef - 30C383D518CFCA6B00FABFFE - isa - PBXBuildFile - - 30C383D918CFCA6B00FABFFE - - fileRef - 30C383D618CFCA6B00FABFFE - isa - PBXBuildFile - - 30C383DA18CFDE6D00FABFFE - - children - - 30C383DB18CFDE8F00FABFFE - - isa - PBXGroup - name - UI - sourceTree - <group> - - 30C383DB18CFDE8F00FABFFE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYAppUITests.m - path - Core/UI/TYAppUITests.m - sourceTree - <group> - - 30C383DC18CFDE8F00FABFFE - - fileRef - 30C383DB18CFDE8F00FABFFE - isa - PBXBuildFile - - 30C383DD18CFDFF000FABFFE - - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYStatusMenu.h - path - Core/UI/TYStatusMenu.h - sourceTree - <group> - - 30C383DE18CFE02100FABFFE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYDefaultAppUI.h - path - Core/UI/TYDefaultAppUI.h - sourceTree - <group> - - 30C383DF18CFE02100FABFFE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYDefaultAppUI.m - path - Core/UI/TYDefaultAppUI.m - sourceTree - <group> - - 30C383E018CFE02100FABFFE - - fileRef - 30C383DF18CFE02100FABFFE - isa - PBXBuildFile - - 30C383E118CFE34700FABFFE - - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYStatusIcon.h - path - Core/UI/TYStatusIcon.h - sourceTree - <group> - - 30CFBF0718BD45BF000266B4 - - buildActionMask - 2147483647 - dstPath - - dstSubfolderSpec - 16 - files - - isa - PBXCopyFilesBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 30CFBF1018BD76F7000266B4 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYMockSystemTimer.h - path - Mock/TYMockSystemTimer.h - sourceTree - <group> - - 30CFBF1118BD76F7000266B4 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYMockSystemTimer.m - path - Mock/TYMockSystemTimer.m - sourceTree - <group> - - 30CFBF1218BD76F7000266B4 - - fileRef - 30CFBF1118BD76F7000266B4 - isa - PBXBuildFile - - 30CFBF1318BD76FC000266B4 - - children - - 30BD314118C556EE00428B1E - 30BD314218C556EE00428B1E - 30CFBF1018BD76F7000266B4 - 30CFBF1118BD76F7000266B4 - 309ECAFB18C36F6300B270BF - 309ECAFC18C36F6300B270BF - 3032EEEB18C6C28700070BD2 - 3032EEEC18C6C28700070BD2 - - isa - PBXGroup - name - Mock - sourceTree - <group> - - 30DB72F518CD4FC800293915 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYTomightyTests.m - path - Core/TYTomightyTests.m - sourceTree - <group> - - 30DB72F618CD4FC800293915 - - fileRef - 30DB72F518CD4FC800293915 - isa - PBXBuildFile - - 30DB72F718CD54C000293915 - - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYTomighty.h - path - Core/TYTomighty.h - sourceTree - <group> - - 30DB72F818CD54D200293915 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - TYDefaultTomighty.h - path - Core/TYDefaultTomighty.h - sourceTree - <group> - - 30DB72F918CD54D200293915 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - TYDefaultTomighty.m - path - Core/TYDefaultTomighty.m - sourceTree - <group> - - 30DB72FA18CD54D200293915 - - fileRef - 30DB72F918CD54D200293915 - isa - PBXBuildFile - - 448B4AF8B231E32919AFF1BF - - children - - 4E46E0E26D22DDAFC599CB28 - 9C134136195EF68DBA17C261 - - isa - PBXGroup - name - Pods - sourceTree - <group> - - 4E46E0E26D22DDAFC599CB28 - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text.xcconfig - name - Pods-TomightyTests.debug.xcconfig - path - Pods/Target Support Files/Pods-TomightyTests/Pods-TomightyTests.debug.xcconfig - sourceTree - <group> - - 88742E1C44894488BB0F167C - - fileRef - 0B1A27968CA44FEFB1DA3DB3 - isa - PBXBuildFile - - 94D0AC8D9A87412895298800 - - buildActionMask - 2147483647 - files - - inputPaths - - isa - PBXShellScriptBuildPhase - name - Copy Pods Resources - outputPaths - - runOnlyForDeploymentPostprocessing - 0 - shellPath - /bin/sh - shellScript - "${SRCROOT}/Pods/Target Support Files/Pods-TomightyTests/Pods-TomightyTests-resources.sh" - - showEnvVarsInLog - 0 - - 9824E2BC220CB543E2CD32C4 - - buildActionMask - 2147483647 - files - - inputPaths - - isa - PBXShellScriptBuildPhase - name - Embed Pods Frameworks - outputPaths - - runOnlyForDeploymentPostprocessing - 0 - shellPath - /bin/sh - shellScript - "${SRCROOT}/Pods/Target Support Files/Pods-TomightyTests/Pods-TomightyTests-frameworks.sh" - - showEnvVarsInLog - 0 - - 9C134136195EF68DBA17C261 - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text.xcconfig - name - Pods-TomightyTests.release.xcconfig - path - Pods/Target Support Files/Pods-TomightyTests/Pods-TomightyTests.release.xcconfig - sourceTree - <group> - - B7B8607396F24F888FD9E51D - - buildActionMask - 2147483647 - files - - inputPaths - - isa - PBXShellScriptBuildPhase - name - Check Pods Manifest.lock - outputPaths - - runOnlyForDeploymentPostprocessing - 0 - shellPath - /bin/sh - shellScript - diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null -if [[ $? != 0 ]] ; then - cat << EOM -error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. -EOM - exit 1 -fi - - showEnvVarsInLog - 0 - - - rootObject - 304AF80A18BD04BE00A2EA74 - - +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 300AE29218D1444400264309 /* PreferencesWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 300AE29018D1444400264309 /* PreferencesWindow.xib */; }; + 300AE29518D1471F00264309 /* TYPreferencesWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 300AE29418D1471F00264309 /* TYPreferencesWindowController.m */; }; + 301A007918BD417200B8DEE0 /* TYDefaultTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 301A007818BD417200B8DEE0 /* TYDefaultTimer.m */; }; + 3025AE5518D35B2B00BC4207 /* TYSoundAgent.m in Sources */ = {isa = PBXBuildFile; fileRef = 3025AE5218D35B2B00BC4207 /* TYSoundAgent.m */; }; + 3025AE5618D35B2B00BC4207 /* TYUserInterfaceAgent.m in Sources */ = {isa = PBXBuildFile; fileRef = 3025AE5418D35B2B00BC4207 /* TYUserInterfaceAgent.m */; }; + 3025AE5918D35B3700BC4207 /* TYSyntheticEventPublisher.m in Sources */ = {isa = PBXBuildFile; fileRef = 3025AE5818D35B3700BC4207 /* TYSyntheticEventPublisher.m */; }; + 3025AE5D18D35C0D00BC4207 /* TYSoundAgentTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3025AE5B18D35C0D00BC4207 /* TYSoundAgentTests.m */; }; + 3025AE5E18D35C0D00BC4207 /* TYUserInterfaceAgentTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3025AE5C18D35C0D00BC4207 /* TYUserInterfaceAgentTests.m */; }; + 3025AE6018D35C1700BC4207 /* TYSyntheticEventPublisherTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3025AE5F18D35C1700BC4207 /* TYSyntheticEventPublisherTests.m */; }; + 3032EEE318C6AF2C00070BD2 /* TYDefaultSoundPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3032EEE218C6AF2C00070BD2 /* TYDefaultSoundPlayer.m */; }; + 3032EEED18C6C28700070BD2 /* TYPublishedEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 3032EEEC18C6C28700070BD2 /* TYPublishedEvent.m */; }; + 3039D2F518C4DF7C008689C9 /* TYDefaultEventBus.m in Sources */ = {isa = PBXBuildFile; fileRef = 3039D2F318C4DF7C008689C9 /* TYDefaultEventBus.m */; }; + 3039D2F818C4DFCE008689C9 /* TYEventBusTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3039D2F718C4DFCE008689C9 /* TYEventBusTests.m */; }; + 30415FAE18C5109D0069FAE3 /* TYPreferencesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 30415FAD18C5109D0069FAE3 /* TYPreferencesTests.m */; }; + 30415FB618C51C290069FAE3 /* TYUserDefaultsPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 30415FB518C51C290069FAE3 /* TYUserDefaultsPreferences.m */; }; + 304AF81618BD04BE00A2EA74 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 304AF81518BD04BE00A2EA74 /* Cocoa.framework */; }; + 304AF82018BD04BE00A2EA74 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 304AF81E18BD04BE00A2EA74 /* InfoPlist.strings */; }; + 304AF82218BD04BE00A2EA74 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 304AF82118BD04BE00A2EA74 /* main.m */; }; + 304AF82618BD04BE00A2EA74 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 304AF82418BD04BE00A2EA74 /* Credits.rtf */; }; + 304AF82918BD04BE00A2EA74 /* TYAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 304AF82818BD04BE00A2EA74 /* TYAppDelegate.m */; }; + 304AF82C18BD04BE00A2EA74 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 304AF82A18BD04BE00A2EA74 /* MainMenu.xib */; }; + 304AF82E18BD04BE00A2EA74 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 304AF82D18BD04BE00A2EA74 /* Images.xcassets */; }; + 304AF83518BD04BF00A2EA74 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 304AF83418BD04BE00A2EA74 /* XCTest.framework */; }; + 304AF83618BD04BF00A2EA74 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 304AF81518BD04BE00A2EA74 /* Cocoa.framework */; }; + 304AF83E18BD04BF00A2EA74 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 304AF83C18BD04BF00A2EA74 /* InfoPlist.strings */; }; + 305D161E18CD13F100CE6A34 /* tomighty.icns in Resources */ = {isa = PBXBuildFile; fileRef = 305D161D18CD13F100CE6A34 /* tomighty.icns */; }; + 309394E718D0C76100D6C71A /* TYDefaultStatusIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 309394E618D0C76100D6C71A /* TYDefaultStatusIcon.m */; }; + 309394EA18D0CBEC00D6C71A /* TYImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 309394E918D0CBEC00D6C71A /* TYImageLoader.m */; }; + 309ECAFD18C36F6300B270BF /* TYMockTimerContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 309ECAFC18C36F6300B270BF /* TYMockTimerContext.m */; }; + 309ECB0418C3828B00B270BF /* TYDefaultSystemTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 309ECB0218C3828B00B270BF /* TYDefaultSystemTimer.m */; }; + 309ECB0818C382CF00B270BF /* TYTimerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 309ECB0718C382CF00B270BF /* TYTimerTests.m */; }; + 309ECB0A18C3830B00B270BF /* TYTimerContextTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 309ECB0918C3830B00B270BF /* TYTimerContextTests.m */; }; + 30B89F9E18C3855600C1DD2B /* TYDefaultTimerContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 30B89F9D18C3855600C1DD2B /* TYDefaultTimerContext.m */; }; + 30BD314318C556EE00428B1E /* TYMockEventBus.m in Sources */ = {isa = PBXBuildFile; fileRef = 30BD314218C556EE00428B1E /* TYMockEventBus.m */; }; + 30C383C918CFC9FC00FABFFE /* icon-clock.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 30C383BF18CFC9FC00FABFFE /* icon-clock.tiff */; }; + 30C383CA18CFC9FC00FABFFE /* icon-start-long-break.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 30C383C018CFC9FC00FABFFE /* icon-start-long-break.tiff */; }; + 30C383CB18CFC9FC00FABFFE /* icon-start-pomodoro.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 30C383C118CFC9FC00FABFFE /* icon-start-pomodoro.tiff */; }; + 30C383CC18CFC9FC00FABFFE /* icon-start-short-break.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 30C383C218CFC9FC00FABFFE /* icon-start-short-break.tiff */; }; + 30C383CD18CFC9FC00FABFFE /* icon-status-long-break.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 30C383C318CFC9FC00FABFFE /* icon-status-long-break.tiff */; }; + 30C383CE18CFC9FC00FABFFE /* icon-status-idle.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 30C383C418CFC9FC00FABFFE /* icon-status-idle.tiff */; }; + 30C383CF18CFC9FC00FABFFE /* icon-status-pomodoro.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 30C383C518CFC9FC00FABFFE /* icon-status-pomodoro.tiff */; }; + 30C383D018CFC9FC00FABFFE /* icon-status-short-break.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 30C383C618CFC9FC00FABFFE /* icon-status-short-break.tiff */; }; + 30C383D118CFC9FC00FABFFE /* icon-status-alternate.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 30C383C718CFC9FC00FABFFE /* icon-status-alternate.tiff */; }; + 30C383D218CFC9FC00FABFFE /* icon-stop-timer.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 30C383C818CFC9FC00FABFFE /* icon-stop-timer.tiff */; }; + 30C383D718CFCA6B00FABFFE /* timer_start.wav in Resources */ = {isa = PBXBuildFile; fileRef = 30C383D418CFCA6B00FABFFE /* timer_start.wav */; }; + 30C383D818CFCA6B00FABFFE /* timer_goes_off.wav in Resources */ = {isa = PBXBuildFile; fileRef = 30C383D518CFCA6B00FABFFE /* timer_goes_off.wav */; }; + 30C383D918CFCA6B00FABFFE /* timer_tick.wav in Resources */ = {isa = PBXBuildFile; fileRef = 30C383D618CFCA6B00FABFFE /* timer_tick.wav */; }; + 30C383DC18CFDE8F00FABFFE /* TYAppUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C383DB18CFDE8F00FABFFE /* TYAppUITests.m */; }; + 30C383E018CFE02100FABFFE /* TYDefaultAppUI.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C383DF18CFE02100FABFFE /* TYDefaultAppUI.m */; }; + 30CFBF1218BD76F7000266B4 /* TYMockSystemTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 30CFBF1118BD76F7000266B4 /* TYMockSystemTimer.m */; }; + 30DB72F618CD4FC800293915 /* TYTomightyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 30DB72F518CD4FC800293915 /* TYTomightyTests.m */; }; + 30DB72FA18CD54D200293915 /* TYDefaultTomighty.m in Sources */ = {isa = PBXBuildFile; fileRef = 30DB72F918CD54D200293915 /* TYDefaultTomighty.m */; }; + 88742E1C44894488BB0F167C /* libPods-TomightyTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B1A27968CA44FEFB1DA3DB3 /* libPods-TomightyTests.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 304AF83718BD04BF00A2EA74 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 304AF80A18BD04BE00A2EA74 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 304AF81118BD04BE00A2EA74; + remoteInfo = Tomighty; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 30CFBF0718BD45BF000266B4 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0B1A27968CA44FEFB1DA3DB3 /* libPods-TomightyTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-TomightyTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 300AE29118D1444400264309 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PreferencesWindow.xib; sourceTree = ""; }; + 300AE29318D1471F00264309 /* TYPreferencesWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYPreferencesWindowController.h; path = Core/UI/TYPreferencesWindowController.h; sourceTree = ""; }; + 300AE29418D1471F00264309 /* TYPreferencesWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYPreferencesWindowController.m; path = Core/UI/TYPreferencesWindowController.m; sourceTree = ""; }; + 301A007718BD417200B8DEE0 /* TYDefaultTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYDefaultTimer.h; path = Core/Timer/TYDefaultTimer.h; sourceTree = ""; }; + 301A007818BD417200B8DEE0 /* TYDefaultTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYDefaultTimer.m; path = Core/Timer/TYDefaultTimer.m; sourceTree = ""; }; + 301A007B18BD421500B8DEE0 /* TYTimerContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYTimerContext.h; path = Core/Timer/TYTimerContext.h; sourceTree = ""; }; + 3025AE5118D35B2B00BC4207 /* TYSoundAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYSoundAgent.h; path = Core/Agent/TYSoundAgent.h; sourceTree = ""; }; + 3025AE5218D35B2B00BC4207 /* TYSoundAgent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYSoundAgent.m; path = Core/Agent/TYSoundAgent.m; sourceTree = ""; }; + 3025AE5318D35B2B00BC4207 /* TYUserInterfaceAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYUserInterfaceAgent.h; path = Core/Agent/TYUserInterfaceAgent.h; sourceTree = ""; }; + 3025AE5418D35B2B00BC4207 /* TYUserInterfaceAgent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYUserInterfaceAgent.m; path = Core/Agent/TYUserInterfaceAgent.m; sourceTree = ""; }; + 3025AE5718D35B3700BC4207 /* TYSyntheticEventPublisher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYSyntheticEventPublisher.h; path = Core/Event/TYSyntheticEventPublisher.h; sourceTree = ""; }; + 3025AE5818D35B3700BC4207 /* TYSyntheticEventPublisher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYSyntheticEventPublisher.m; path = Core/Event/TYSyntheticEventPublisher.m; sourceTree = ""; }; + 3025AE5B18D35C0D00BC4207 /* TYSoundAgentTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYSoundAgentTests.m; path = Core/Agent/TYSoundAgentTests.m; sourceTree = ""; }; + 3025AE5C18D35C0D00BC4207 /* TYUserInterfaceAgentTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYUserInterfaceAgentTests.m; path = Core/Agent/TYUserInterfaceAgentTests.m; sourceTree = ""; }; + 3025AE5F18D35C1700BC4207 /* TYSyntheticEventPublisherTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYSyntheticEventPublisherTests.m; path = Core/Event/TYSyntheticEventPublisherTests.m; sourceTree = ""; }; + 3032EEE118C6AF2C00070BD2 /* TYDefaultSoundPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYDefaultSoundPlayer.h; path = Core/Sound/TYDefaultSoundPlayer.h; sourceTree = ""; }; + 3032EEE218C6AF2C00070BD2 /* TYDefaultSoundPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYDefaultSoundPlayer.m; path = Core/Sound/TYDefaultSoundPlayer.m; sourceTree = ""; }; + 3032EEEB18C6C28700070BD2 /* TYPublishedEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYPublishedEvent.h; path = Mock/TYPublishedEvent.h; sourceTree = ""; }; + 3032EEEC18C6C28700070BD2 /* TYPublishedEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYPublishedEvent.m; path = Mock/TYPublishedEvent.m; sourceTree = ""; }; + 3039D2F218C4DF7C008689C9 /* TYDefaultEventBus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYDefaultEventBus.h; path = Core/Event/TYDefaultEventBus.h; sourceTree = ""; }; + 3039D2F318C4DF7C008689C9 /* TYDefaultEventBus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYDefaultEventBus.m; path = Core/Event/TYDefaultEventBus.m; sourceTree = ""; }; + 3039D2F418C4DF7C008689C9 /* TYEventBus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYEventBus.h; path = Core/Event/TYEventBus.h; sourceTree = ""; }; + 3039D2F718C4DFCE008689C9 /* TYEventBusTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYEventBusTests.m; path = Core/Event/TYEventBusTests.m; sourceTree = ""; }; + 30415FAD18C5109D0069FAE3 /* TYPreferencesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYPreferencesTests.m; path = Core/Preferences/TYPreferencesTests.m; sourceTree = ""; }; + 30415FB018C51B6A0069FAE3 /* TYPreferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYPreferences.h; path = Core/Preferences/TYPreferences.h; sourceTree = ""; }; + 30415FB418C51C290069FAE3 /* TYUserDefaultsPreferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYUserDefaultsPreferences.h; path = Core/Preferences/TYUserDefaultsPreferences.h; sourceTree = ""; }; + 30415FB518C51C290069FAE3 /* TYUserDefaultsPreferences.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYUserDefaultsPreferences.m; path = Core/Preferences/TYUserDefaultsPreferences.m; sourceTree = ""; }; + 304AF81218BD04BE00A2EA74 /* Tomighty.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tomighty.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 304AF81518BD04BE00A2EA74 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 304AF81818BD04BE00A2EA74 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 304AF81918BD04BE00A2EA74 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 304AF81A18BD04BE00A2EA74 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 304AF81D18BD04BE00A2EA74 /* Tomighty-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tomighty-Info.plist"; sourceTree = ""; }; + 304AF81F18BD04BE00A2EA74 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 304AF82118BD04BE00A2EA74 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 304AF82318BD04BE00A2EA74 /* Tomighty-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tomighty-Prefix.pch"; sourceTree = ""; }; + 304AF82518BD04BE00A2EA74 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + 304AF82718BD04BE00A2EA74 /* TYAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TYAppDelegate.h; sourceTree = ""; }; + 304AF82818BD04BE00A2EA74 /* TYAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TYAppDelegate.m; sourceTree = ""; }; + 304AF82B18BD04BE00A2EA74 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 304AF82D18BD04BE00A2EA74 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 304AF83318BD04BE00A2EA74 /* TomightyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TomightyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 304AF83418BD04BE00A2EA74 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 304AF83B18BD04BF00A2EA74 /* TomightyTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TomightyTests-Info.plist"; sourceTree = ""; }; + 304AF83D18BD04BF00A2EA74 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 305D161418CCEE3500CE6A34 /* TYTimer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TYTimer.h; path = Core/Timer/TYTimer.h; sourceTree = ""; }; + 305D161618CD02E100CE6A34 /* TYAppUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TYAppUI.h; path = Core/UI/TYAppUI.h; sourceTree = ""; }; + 305D161D18CD13F100CE6A34 /* tomighty.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = tomighty.icns; sourceTree = ""; }; + 309394E518D0C76100D6C71A /* TYDefaultStatusIcon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYDefaultStatusIcon.h; path = Core/UI/TYDefaultStatusIcon.h; sourceTree = ""; }; + 309394E618D0C76100D6C71A /* TYDefaultStatusIcon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYDefaultStatusIcon.m; path = Core/UI/TYDefaultStatusIcon.m; sourceTree = ""; }; + 309394E818D0CBEC00D6C71A /* TYImageLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYImageLoader.h; path = Core/UI/TYImageLoader.h; sourceTree = ""; }; + 309394E918D0CBEC00D6C71A /* TYImageLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYImageLoader.m; path = Core/UI/TYImageLoader.m; sourceTree = ""; }; + 309ECAFB18C36F6300B270BF /* TYMockTimerContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYMockTimerContext.h; path = Mock/TYMockTimerContext.h; sourceTree = ""; }; + 309ECAFC18C36F6300B270BF /* TYMockTimerContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYMockTimerContext.m; path = Mock/TYMockTimerContext.m; sourceTree = ""; }; + 309ECB0118C3828B00B270BF /* TYDefaultSystemTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYDefaultSystemTimer.h; path = Core/Timer/TYDefaultSystemTimer.h; sourceTree = ""; }; + 309ECB0218C3828B00B270BF /* TYDefaultSystemTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYDefaultSystemTimer.m; path = Core/Timer/TYDefaultSystemTimer.m; sourceTree = ""; }; + 309ECB0318C3828B00B270BF /* TYSystemTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYSystemTimer.h; path = Core/Timer/TYSystemTimer.h; sourceTree = ""; }; + 309ECB0718C382CF00B270BF /* TYTimerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYTimerTests.m; path = Core/Timer/TYTimerTests.m; sourceTree = ""; }; + 309ECB0918C3830B00B270BF /* TYTimerContextTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYTimerContextTests.m; path = Core/Timer/TYTimerContextTests.m; sourceTree = ""; }; + 30B89F9C18C3855600C1DD2B /* TYDefaultTimerContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYDefaultTimerContext.h; path = Core/Timer/TYDefaultTimerContext.h; sourceTree = ""; }; + 30B89F9D18C3855600C1DD2B /* TYDefaultTimerContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYDefaultTimerContext.m; path = Core/Timer/TYDefaultTimerContext.m; sourceTree = ""; }; + 30BD314118C556EE00428B1E /* TYMockEventBus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYMockEventBus.h; path = Mock/TYMockEventBus.h; sourceTree = ""; }; + 30BD314218C556EE00428B1E /* TYMockEventBus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYMockEventBus.m; path = Mock/TYMockEventBus.m; sourceTree = ""; }; + 30BD314B18C5686500428B1E /* TYSoundPlayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TYSoundPlayer.h; path = Core/Sound/TYSoundPlayer.h; sourceTree = ""; }; + 30C383BF18CFC9FC00FABFFE /* icon-clock.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "icon-clock.tiff"; path = "Icons/icon-clock.tiff"; sourceTree = SOURCE_ROOT; }; + 30C383C018CFC9FC00FABFFE /* icon-start-long-break.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "icon-start-long-break.tiff"; path = "Icons/icon-start-long-break.tiff"; sourceTree = SOURCE_ROOT; }; + 30C383C118CFC9FC00FABFFE /* icon-start-pomodoro.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "icon-start-pomodoro.tiff"; path = "Icons/icon-start-pomodoro.tiff"; sourceTree = SOURCE_ROOT; }; + 30C383C218CFC9FC00FABFFE /* icon-start-short-break.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "icon-start-short-break.tiff"; path = "Icons/icon-start-short-break.tiff"; sourceTree = SOURCE_ROOT; }; + 30C383C318CFC9FC00FABFFE /* icon-status-long-break.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "icon-status-long-break.tiff"; path = "Icons/icon-status-long-break.tiff"; sourceTree = SOURCE_ROOT; }; + 30C383C418CFC9FC00FABFFE /* icon-status-idle.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "icon-status-idle.tiff"; path = "Icons/icon-status-idle.tiff"; sourceTree = SOURCE_ROOT; }; + 30C383C518CFC9FC00FABFFE /* icon-status-pomodoro.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "icon-status-pomodoro.tiff"; path = "Icons/icon-status-pomodoro.tiff"; sourceTree = SOURCE_ROOT; }; + 30C383C618CFC9FC00FABFFE /* icon-status-short-break.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "icon-status-short-break.tiff"; path = "Icons/icon-status-short-break.tiff"; sourceTree = SOURCE_ROOT; }; + 30C383C718CFC9FC00FABFFE /* icon-status-alternate.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "icon-status-alternate.tiff"; path = "Icons/icon-status-alternate.tiff"; sourceTree = SOURCE_ROOT; }; + 30C383C818CFC9FC00FABFFE /* icon-stop-timer.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "icon-stop-timer.tiff"; path = "Icons/icon-stop-timer.tiff"; sourceTree = SOURCE_ROOT; }; + 30C383D418CFCA6B00FABFFE /* timer_start.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = timer_start.wav; path = Sound/timer_start.wav; sourceTree = SOURCE_ROOT; }; + 30C383D518CFCA6B00FABFFE /* timer_goes_off.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = timer_goes_off.wav; path = Sound/timer_goes_off.wav; sourceTree = SOURCE_ROOT; }; + 30C383D618CFCA6B00FABFFE /* timer_tick.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = timer_tick.wav; path = Sound/timer_tick.wav; sourceTree = SOURCE_ROOT; }; + 30C383DB18CFDE8F00FABFFE /* TYAppUITests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYAppUITests.m; path = Core/UI/TYAppUITests.m; sourceTree = ""; }; + 30C383DD18CFDFF000FABFFE /* TYStatusMenu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TYStatusMenu.h; path = Core/UI/TYStatusMenu.h; sourceTree = ""; }; + 30C383DE18CFE02100FABFFE /* TYDefaultAppUI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYDefaultAppUI.h; path = Core/UI/TYDefaultAppUI.h; sourceTree = ""; }; + 30C383DF18CFE02100FABFFE /* TYDefaultAppUI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYDefaultAppUI.m; path = Core/UI/TYDefaultAppUI.m; sourceTree = ""; }; + 30C383E118CFE34700FABFFE /* TYStatusIcon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TYStatusIcon.h; path = Core/UI/TYStatusIcon.h; sourceTree = ""; }; + 30CFBF1018BD76F7000266B4 /* TYMockSystemTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYMockSystemTimer.h; path = Mock/TYMockSystemTimer.h; sourceTree = ""; }; + 30CFBF1118BD76F7000266B4 /* TYMockSystemTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYMockSystemTimer.m; path = Mock/TYMockSystemTimer.m; sourceTree = ""; }; + 30DB72F518CD4FC800293915 /* TYTomightyTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYTomightyTests.m; path = Core/TYTomightyTests.m; sourceTree = ""; }; + 30DB72F718CD54C000293915 /* TYTomighty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TYTomighty.h; path = Core/TYTomighty.h; sourceTree = ""; }; + 30DB72F818CD54D200293915 /* TYDefaultTomighty.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYDefaultTomighty.h; path = Core/TYDefaultTomighty.h; sourceTree = ""; }; + 30DB72F918CD54D200293915 /* TYDefaultTomighty.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYDefaultTomighty.m; path = Core/TYDefaultTomighty.m; sourceTree = ""; }; + 4E46E0E26D22DDAFC599CB28 /* Pods-TomightyTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TomightyTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TomightyTests/Pods-TomightyTests.debug.xcconfig"; sourceTree = ""; }; + 9C134136195EF68DBA17C261 /* Pods-TomightyTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TomightyTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-TomightyTests/Pods-TomightyTests.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 304AF80F18BD04BE00A2EA74 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 304AF81618BD04BE00A2EA74 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 304AF83018BD04BE00A2EA74 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 304AF83618BD04BF00A2EA74 /* Cocoa.framework in Frameworks */, + 304AF83518BD04BF00A2EA74 /* XCTest.framework in Frameworks */, + 88742E1C44894488BB0F167C /* libPods-TomightyTests.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 301A007618BD413400B8DEE0 /* Timer */ = { + isa = PBXGroup; + children = ( + 309ECB0318C3828B00B270BF /* TYSystemTimer.h */, + 309ECB0118C3828B00B270BF /* TYDefaultSystemTimer.h */, + 309ECB0218C3828B00B270BF /* TYDefaultSystemTimer.m */, + 305D161418CCEE3500CE6A34 /* TYTimer.h */, + 301A007718BD417200B8DEE0 /* TYDefaultTimer.h */, + 301A007818BD417200B8DEE0 /* TYDefaultTimer.m */, + 301A007B18BD421500B8DEE0 /* TYTimerContext.h */, + 30B89F9C18C3855600C1DD2B /* TYDefaultTimerContext.h */, + 30B89F9D18C3855600C1DD2B /* TYDefaultTimerContext.m */, + ); + name = Timer; + sourceTree = ""; + }; + 3025AE5018D35AA000BC4207 /* Agent */ = { + isa = PBXGroup; + children = ( + 3025AE5118D35B2B00BC4207 /* TYSoundAgent.h */, + 3025AE5218D35B2B00BC4207 /* TYSoundAgent.m */, + 3025AE5318D35B2B00BC4207 /* TYUserInterfaceAgent.h */, + 3025AE5418D35B2B00BC4207 /* TYUserInterfaceAgent.m */, + ); + name = Agent; + sourceTree = ""; + }; + 3025AE5A18D35BAB00BC4207 /* Agent */ = { + isa = PBXGroup; + children = ( + 3025AE5B18D35C0D00BC4207 /* TYSoundAgentTests.m */, + 3025AE5C18D35C0D00BC4207 /* TYUserInterfaceAgentTests.m */, + ); + name = Agent; + sourceTree = ""; + }; + 3039D2F118C4DF47008689C9 /* Event */ = { + isa = PBXGroup; + children = ( + 3025AE5718D35B3700BC4207 /* TYSyntheticEventPublisher.h */, + 3025AE5818D35B3700BC4207 /* TYSyntheticEventPublisher.m */, + 3039D2F418C4DF7C008689C9 /* TYEventBus.h */, + 3039D2F218C4DF7C008689C9 /* TYDefaultEventBus.h */, + 3039D2F318C4DF7C008689C9 /* TYDefaultEventBus.m */, + ); + name = Event; + sourceTree = ""; + }; + 3039D2F618C4DFB0008689C9 /* Event */ = { + isa = PBXGroup; + children = ( + 3039D2F718C4DFCE008689C9 /* TYEventBusTests.m */, + 3025AE5F18D35C1700BC4207 /* TYSyntheticEventPublisherTests.m */, + ); + name = Event; + sourceTree = ""; + }; + 30415FAC18C5105D0069FAE3 /* Preferences */ = { + isa = PBXGroup; + children = ( + 30415FAD18C5109D0069FAE3 /* TYPreferencesTests.m */, + ); + name = Preferences; + sourceTree = ""; + }; + 30415FAF18C51B4D0069FAE3 /* Preferences */ = { + isa = PBXGroup; + children = ( + 30415FB018C51B6A0069FAE3 /* TYPreferences.h */, + 30415FB418C51C290069FAE3 /* TYUserDefaultsPreferences.h */, + 30415FB518C51C290069FAE3 /* TYUserDefaultsPreferences.m */, + ); + name = Preferences; + sourceTree = ""; + }; + 304AF80918BD04BE00A2EA74 = { + isa = PBXGroup; + children = ( + 305D161D18CD13F100CE6A34 /* tomighty.icns */, + 305D161A18CD12FA00CE6A34 /* Icons */, + 30C383D318CFCA3700FABFFE /* Sound */, + 304AF81B18BD04BE00A2EA74 /* Tomighty */, + 304AF83918BD04BF00A2EA74 /* TomightyTests */, + 304AF81418BD04BE00A2EA74 /* Frameworks */, + 304AF81318BD04BE00A2EA74 /* Products */, + 448B4AF8B231E32919AFF1BF /* Pods */, + ); + sourceTree = ""; + }; + 304AF81318BD04BE00A2EA74 /* Products */ = { + isa = PBXGroup; + children = ( + 304AF81218BD04BE00A2EA74 /* Tomighty.app */, + 304AF83318BD04BE00A2EA74 /* TomightyTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 304AF81418BD04BE00A2EA74 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 0B1A27968CA44FEFB1DA3DB3 /* libPods-TomightyTests.a */, + 304AF81518BD04BE00A2EA74 /* Cocoa.framework */, + 304AF83418BD04BE00A2EA74 /* XCTest.framework */, + 304AF81718BD04BE00A2EA74 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 304AF81718BD04BE00A2EA74 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 304AF81818BD04BE00A2EA74 /* AppKit.framework */, + 304AF81918BD04BE00A2EA74 /* CoreData.framework */, + 304AF81A18BD04BE00A2EA74 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 304AF81B18BD04BE00A2EA74 /* Tomighty */ = { + isa = PBXGroup; + children = ( + 304AF84918BD117200A2EA74 /* Core */, + 304AF82718BD04BE00A2EA74 /* TYAppDelegate.h */, + 304AF82818BD04BE00A2EA74 /* TYAppDelegate.m */, + 304AF82A18BD04BE00A2EA74 /* MainMenu.xib */, + 300AE29018D1444400264309 /* PreferencesWindow.xib */, + 304AF82D18BD04BE00A2EA74 /* Images.xcassets */, + 304AF81C18BD04BE00A2EA74 /* Supporting Files */, + ); + path = Tomighty; + sourceTree = ""; + }; + 304AF81C18BD04BE00A2EA74 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 304AF81D18BD04BE00A2EA74 /* Tomighty-Info.plist */, + 304AF81E18BD04BE00A2EA74 /* InfoPlist.strings */, + 304AF82118BD04BE00A2EA74 /* main.m */, + 304AF82318BD04BE00A2EA74 /* Tomighty-Prefix.pch */, + 304AF82418BD04BE00A2EA74 /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 304AF83918BD04BF00A2EA74 /* TomightyTests */ = { + isa = PBXGroup; + children = ( + 309ECB0518C3829700B270BF /* Core */, + 304AF83A18BD04BF00A2EA74 /* Supporting Files */, + 30CFBF1318BD76FC000266B4 /* Mock */, + ); + path = TomightyTests; + sourceTree = ""; + }; + 304AF83A18BD04BF00A2EA74 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 304AF83B18BD04BF00A2EA74 /* TomightyTests-Info.plist */, + 304AF83C18BD04BF00A2EA74 /* InfoPlist.strings */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 304AF84918BD117200A2EA74 /* Core */ = { + isa = PBXGroup; + children = ( + 3025AE5018D35AA000BC4207 /* Agent */, + 3039D2F118C4DF47008689C9 /* Event */, + 30415FAF18C51B4D0069FAE3 /* Preferences */, + 30BD314718C566B400428B1E /* Sound */, + 301A007618BD413400B8DEE0 /* Timer */, + 305D161518CD029F00CE6A34 /* UI */, + 30DB72F718CD54C000293915 /* TYTomighty.h */, + 30DB72F818CD54D200293915 /* TYDefaultTomighty.h */, + 30DB72F918CD54D200293915 /* TYDefaultTomighty.m */, + ); + name = Core; + sourceTree = ""; + }; + 305D161518CD029F00CE6A34 /* UI */ = { + isa = PBXGroup; + children = ( + 305D161618CD02E100CE6A34 /* TYAppUI.h */, + 30C383DE18CFE02100FABFFE /* TYDefaultAppUI.h */, + 30C383DF18CFE02100FABFFE /* TYDefaultAppUI.m */, + 30C383DD18CFDFF000FABFFE /* TYStatusMenu.h */, + 30C383E118CFE34700FABFFE /* TYStatusIcon.h */, + 309394E518D0C76100D6C71A /* TYDefaultStatusIcon.h */, + 309394E618D0C76100D6C71A /* TYDefaultStatusIcon.m */, + 309394E818D0CBEC00D6C71A /* TYImageLoader.h */, + 309394E918D0CBEC00D6C71A /* TYImageLoader.m */, + 300AE29318D1471F00264309 /* TYPreferencesWindowController.h */, + 300AE29418D1471F00264309 /* TYPreferencesWindowController.m */, + ); + name = UI; + sourceTree = ""; + }; + 305D161A18CD12FA00CE6A34 /* Icons */ = { + isa = PBXGroup; + children = ( + 30C383BF18CFC9FC00FABFFE /* icon-clock.tiff */, + 30C383C018CFC9FC00FABFFE /* icon-start-long-break.tiff */, + 30C383C118CFC9FC00FABFFE /* icon-start-pomodoro.tiff */, + 30C383C218CFC9FC00FABFFE /* icon-start-short-break.tiff */, + 30C383C318CFC9FC00FABFFE /* icon-status-long-break.tiff */, + 30C383C418CFC9FC00FABFFE /* icon-status-idle.tiff */, + 30C383C518CFC9FC00FABFFE /* icon-status-pomodoro.tiff */, + 30C383C618CFC9FC00FABFFE /* icon-status-short-break.tiff */, + 30C383C718CFC9FC00FABFFE /* icon-status-alternate.tiff */, + 30C383C818CFC9FC00FABFFE /* icon-stop-timer.tiff */, + ); + name = Icons; + path = Tomighty; + sourceTree = ""; + }; + 309ECB0518C3829700B270BF /* Core */ = { + isa = PBXGroup; + children = ( + 3025AE5A18D35BAB00BC4207 /* Agent */, + 3039D2F618C4DFB0008689C9 /* Event */, + 30415FAC18C5105D0069FAE3 /* Preferences */, + 309ECB0618C3829F00B270BF /* Timer */, + 30C383DA18CFDE6D00FABFFE /* UI */, + 30DB72F518CD4FC800293915 /* TYTomightyTests.m */, + ); + name = Core; + sourceTree = ""; + }; + 309ECB0618C3829F00B270BF /* Timer */ = { + isa = PBXGroup; + children = ( + 309ECB0718C382CF00B270BF /* TYTimerTests.m */, + 309ECB0918C3830B00B270BF /* TYTimerContextTests.m */, + ); + name = Timer; + sourceTree = ""; + }; + 30BD314718C566B400428B1E /* Sound */ = { + isa = PBXGroup; + children = ( + 30BD314B18C5686500428B1E /* TYSoundPlayer.h */, + 3032EEE118C6AF2C00070BD2 /* TYDefaultSoundPlayer.h */, + 3032EEE218C6AF2C00070BD2 /* TYDefaultSoundPlayer.m */, + ); + name = Sound; + sourceTree = ""; + }; + 30C383D318CFCA3700FABFFE /* Sound */ = { + isa = PBXGroup; + children = ( + 30C383D418CFCA6B00FABFFE /* timer_start.wav */, + 30C383D518CFCA6B00FABFFE /* timer_goes_off.wav */, + 30C383D618CFCA6B00FABFFE /* timer_tick.wav */, + ); + name = Sound; + path = Tomighty; + sourceTree = ""; + }; + 30C383DA18CFDE6D00FABFFE /* UI */ = { + isa = PBXGroup; + children = ( + 30C383DB18CFDE8F00FABFFE /* TYAppUITests.m */, + ); + name = UI; + sourceTree = ""; + }; + 30CFBF1318BD76FC000266B4 /* Mock */ = { + isa = PBXGroup; + children = ( + 30BD314118C556EE00428B1E /* TYMockEventBus.h */, + 30BD314218C556EE00428B1E /* TYMockEventBus.m */, + 30CFBF1018BD76F7000266B4 /* TYMockSystemTimer.h */, + 30CFBF1118BD76F7000266B4 /* TYMockSystemTimer.m */, + 309ECAFB18C36F6300B270BF /* TYMockTimerContext.h */, + 309ECAFC18C36F6300B270BF /* TYMockTimerContext.m */, + 3032EEEB18C6C28700070BD2 /* TYPublishedEvent.h */, + 3032EEEC18C6C28700070BD2 /* TYPublishedEvent.m */, + ); + name = Mock; + sourceTree = ""; + }; + 448B4AF8B231E32919AFF1BF /* Pods */ = { + isa = PBXGroup; + children = ( + 4E46E0E26D22DDAFC599CB28 /* Pods-TomightyTests.debug.xcconfig */, + 9C134136195EF68DBA17C261 /* Pods-TomightyTests.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 304AF81118BD04BE00A2EA74 /* Tomighty */ = { + isa = PBXNativeTarget; + buildConfigurationList = 304AF84318BD04BF00A2EA74 /* Build configuration list for PBXNativeTarget "Tomighty" */; + buildPhases = ( + 304AF80E18BD04BE00A2EA74 /* Sources */, + 304AF80F18BD04BE00A2EA74 /* Frameworks */, + 304AF81018BD04BE00A2EA74 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Tomighty; + productName = Tomighty; + productReference = 304AF81218BD04BE00A2EA74 /* Tomighty.app */; + productType = "com.apple.product-type.application"; + }; + 304AF83218BD04BE00A2EA74 /* TomightyTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 304AF84618BD04BF00A2EA74 /* Build configuration list for PBXNativeTarget "TomightyTests" */; + buildPhases = ( + B7B8607396F24F888FD9E51D /* [CP] Check Pods Manifest.lock */, + 304AF82F18BD04BE00A2EA74 /* Sources */, + 304AF83018BD04BE00A2EA74 /* Frameworks */, + 304AF83118BD04BE00A2EA74 /* Resources */, + 30CFBF0718BD45BF000266B4 /* CopyFiles */, + 94D0AC8D9A87412895298800 /* [CP] Copy Pods Resources */, + 9824E2BC220CB543E2CD32C4 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 304AF83818BD04BF00A2EA74 /* PBXTargetDependency */, + ); + name = TomightyTests; + productName = TomightyTests; + productReference = 304AF83318BD04BE00A2EA74 /* TomightyTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 304AF80A18BD04BE00A2EA74 /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = TY; + LastUpgradeCheck = 0730; + ORGANIZATIONNAME = "Gig Software"; + TargetAttributes = { + 304AF83218BD04BE00A2EA74 = { + TestTargetID = 304AF81118BD04BE00A2EA74; + }; + }; + }; + buildConfigurationList = 304AF80D18BD04BE00A2EA74 /* Build configuration list for PBXProject "Tomighty" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 304AF80918BD04BE00A2EA74; + productRefGroup = 304AF81318BD04BE00A2EA74 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 304AF81118BD04BE00A2EA74 /* Tomighty */, + 304AF83218BD04BE00A2EA74 /* TomightyTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 304AF81018BD04BE00A2EA74 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 30C383D918CFCA6B00FABFFE /* timer_tick.wav in Resources */, + 30C383CE18CFC9FC00FABFFE /* icon-status-idle.tiff in Resources */, + 304AF82018BD04BE00A2EA74 /* InfoPlist.strings in Resources */, + 305D161E18CD13F100CE6A34 /* tomighty.icns in Resources */, + 30C383CF18CFC9FC00FABFFE /* icon-status-pomodoro.tiff in Resources */, + 30C383D718CFCA6B00FABFFE /* timer_start.wav in Resources */, + 304AF82E18BD04BE00A2EA74 /* Images.xcassets in Resources */, + 30C383CC18CFC9FC00FABFFE /* icon-start-short-break.tiff in Resources */, + 30C383D118CFC9FC00FABFFE /* icon-status-alternate.tiff in Resources */, + 30C383D218CFC9FC00FABFFE /* icon-stop-timer.tiff in Resources */, + 30C383CD18CFC9FC00FABFFE /* icon-status-long-break.tiff in Resources */, + 30C383C918CFC9FC00FABFFE /* icon-clock.tiff in Resources */, + 30C383CB18CFC9FC00FABFFE /* icon-start-pomodoro.tiff in Resources */, + 30C383D018CFC9FC00FABFFE /* icon-status-short-break.tiff in Resources */, + 30C383CA18CFC9FC00FABFFE /* icon-start-long-break.tiff in Resources */, + 300AE29218D1444400264309 /* PreferencesWindow.xib in Resources */, + 304AF82618BD04BE00A2EA74 /* Credits.rtf in Resources */, + 30C383D818CFCA6B00FABFFE /* timer_goes_off.wav in Resources */, + 304AF82C18BD04BE00A2EA74 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 304AF83118BD04BE00A2EA74 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 304AF83E18BD04BF00A2EA74 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 94D0AC8D9A87412895298800 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TomightyTests/Pods-TomightyTests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9824E2BC220CB543E2CD32C4 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TomightyTests/Pods-TomightyTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + B7B8607396F24F888FD9E51D /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 304AF80E18BD04BE00A2EA74 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 304AF82218BD04BE00A2EA74 /* main.m in Sources */, + 30B89F9E18C3855600C1DD2B /* TYDefaultTimerContext.m in Sources */, + 3025AE5518D35B2B00BC4207 /* TYSoundAgent.m in Sources */, + 309ECB0418C3828B00B270BF /* TYDefaultSystemTimer.m in Sources */, + 3032EEE318C6AF2C00070BD2 /* TYDefaultSoundPlayer.m in Sources */, + 300AE29518D1471F00264309 /* TYPreferencesWindowController.m in Sources */, + 30DB72FA18CD54D200293915 /* TYDefaultTomighty.m in Sources */, + 301A007918BD417200B8DEE0 /* TYDefaultTimer.m in Sources */, + 309394E718D0C76100D6C71A /* TYDefaultStatusIcon.m in Sources */, + 30C383E018CFE02100FABFFE /* TYDefaultAppUI.m in Sources */, + 30415FB618C51C290069FAE3 /* TYUserDefaultsPreferences.m in Sources */, + 3039D2F518C4DF7C008689C9 /* TYDefaultEventBus.m in Sources */, + 309394EA18D0CBEC00D6C71A /* TYImageLoader.m in Sources */, + 3025AE5618D35B2B00BC4207 /* TYUserInterfaceAgent.m in Sources */, + 3025AE5918D35B3700BC4207 /* TYSyntheticEventPublisher.m in Sources */, + 304AF82918BD04BE00A2EA74 /* TYAppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 304AF82F18BD04BE00A2EA74 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 30DB72F618CD4FC800293915 /* TYTomightyTests.m in Sources */, + 309ECB0818C382CF00B270BF /* TYTimerTests.m in Sources */, + 3039D2F818C4DFCE008689C9 /* TYEventBusTests.m in Sources */, + 3025AE6018D35C1700BC4207 /* TYSyntheticEventPublisherTests.m in Sources */, + 309ECAFD18C36F6300B270BF /* TYMockTimerContext.m in Sources */, + 309ECB0A18C3830B00B270BF /* TYTimerContextTests.m in Sources */, + 3025AE5D18D35C0D00BC4207 /* TYSoundAgentTests.m in Sources */, + 3032EEED18C6C28700070BD2 /* TYPublishedEvent.m in Sources */, + 30CFBF1218BD76F7000266B4 /* TYMockSystemTimer.m in Sources */, + 30C383DC18CFDE8F00FABFFE /* TYAppUITests.m in Sources */, + 3025AE5E18D35C0D00BC4207 /* TYUserInterfaceAgentTests.m in Sources */, + 30BD314318C556EE00428B1E /* TYMockEventBus.m in Sources */, + 30415FAE18C5109D0069FAE3 /* TYPreferencesTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 304AF83818BD04BF00A2EA74 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 304AF81118BD04BE00A2EA74 /* Tomighty */; + targetProxy = 304AF83718BD04BF00A2EA74 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 300AE29018D1444400264309 /* PreferencesWindow.xib */ = { + isa = PBXVariantGroup; + children = ( + 300AE29118D1444400264309 /* Base */, + ); + name = PreferencesWindow.xib; + sourceTree = ""; + }; + 304AF81E18BD04BE00A2EA74 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 304AF81F18BD04BE00A2EA74 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 304AF82418BD04BE00A2EA74 /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + 304AF82518BD04BE00A2EA74 /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + 304AF82A18BD04BE00A2EA74 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 304AF82B18BD04BE00A2EA74 /* Base */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; + 304AF83C18BD04BF00A2EA74 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 304AF83D18BD04BF00A2EA74 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 304AF84118BD04BF00A2EA74 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 304AF84218BD04BF00A2EA74 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + SDKROOT = macosx; + }; + name = Release; + }; + 304AF84418BD04BF00A2EA74 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Tomighty/Tomighty-Prefix.pch"; + INFOPLIST_FILE = "Tomighty/Tomighty-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.tomighty.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 304AF84518BD04BF00A2EA74 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Tomighty/Tomighty-Prefix.pch"; + INFOPLIST_FILE = "Tomighty/Tomighty-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.tomighty.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + 304AF84718BD04BF00A2EA74 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4E46E0E26D22DDAFC599CB28 /* Pods-TomightyTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Tomighty.app/Contents/MacOS/Tomighty"; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(inherited)", + "$(PROJECT_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Tomighty/Tomighty-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "TomightyTests/TomightyTests-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "Gig.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = xctest; + }; + name = Debug; + }; + 304AF84818BD04BF00A2EA74 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9C134136195EF68DBA17C261 /* Pods-TomightyTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Tomighty.app/Contents/MacOS/Tomighty"; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(inherited)", + "$(PROJECT_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Tomighty/Tomighty-Prefix.pch"; + INFOPLIST_FILE = "TomightyTests/TomightyTests-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "Gig.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = xctest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 304AF80D18BD04BE00A2EA74 /* Build configuration list for PBXProject "Tomighty" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 304AF84118BD04BF00A2EA74 /* Debug */, + 304AF84218BD04BF00A2EA74 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 304AF84318BD04BF00A2EA74 /* Build configuration list for PBXNativeTarget "Tomighty" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 304AF84418BD04BF00A2EA74 /* Debug */, + 304AF84518BD04BF00A2EA74 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 304AF84618BD04BF00A2EA74 /* Build configuration list for PBXNativeTarget "TomightyTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 304AF84718BD04BF00A2EA74 /* Debug */, + 304AF84818BD04BF00A2EA74 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 304AF80A18BD04BE00A2EA74 /* Project object */; +} diff --git a/src/Tomighty/Tomighty-Info.plist b/src/Tomighty/Tomighty-Info.plist index dc955e0..1ecf76e 100644 --- a/src/Tomighty/Tomighty-Info.plist +++ b/src/Tomighty/Tomighty-Info.plist @@ -9,7 +9,7 @@ CFBundleIconFile tomighty CFBundleIdentifier - org.tomighty.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -26,12 +26,12 @@ public.app-category.productivity LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} + LSUIElement + NSHumanReadableCopyright Copyright © 2014 Célio Cidral Jr. All rights reserved. NSMainNibFile MainMenu - LSUIElement - NSPrincipalClass NSApplication diff --git a/src/TomightyTests/TomightyTests-Info.plist b/src/TomightyTests/TomightyTests-Info.plist index 7173566..169b6f7 100644 --- a/src/TomightyTests/TomightyTests-Info.plist +++ b/src/TomightyTests/TomightyTests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - Gig.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType From 61267e0ac84e5ad55aba2305e1be45a8d40d1c03 Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Fri, 2 Sep 2016 12:38:13 +0400 Subject: [PATCH 04/32] Add Hotkey handler and tests --- src/Tomighty.xcodeproj/project.pbxproj | 26 ++ src/Tomighty/Core/Hotkey/MVTHotkey.h | 33 +++ src/Tomighty/Core/Hotkey/MVTHotkey.m | 267 ++++++++++++++++++ .../Core/Hotkey/MVTHotkeyTests.m | 96 +++++++ 4 files changed, 422 insertions(+) create mode 100644 src/Tomighty/Core/Hotkey/MVTHotkey.h create mode 100644 src/Tomighty/Core/Hotkey/MVTHotkey.m create mode 100644 src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m diff --git a/src/Tomighty.xcodeproj/project.pbxproj b/src/Tomighty.xcodeproj/project.pbxproj index 8c4dcdc..7ebf5f6 100644 --- a/src/Tomighty.xcodeproj/project.pbxproj +++ b/src/Tomighty.xcodeproj/project.pbxproj @@ -60,6 +60,8 @@ 30DB72F618CD4FC800293915 /* TYTomightyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 30DB72F518CD4FC800293915 /* TYTomightyTests.m */; }; 30DB72FA18CD54D200293915 /* TYDefaultTomighty.m in Sources */ = {isa = PBXBuildFile; fileRef = 30DB72F918CD54D200293915 /* TYDefaultTomighty.m */; }; 88742E1C44894488BB0F167C /* libPods-TomightyTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B1A27968CA44FEFB1DA3DB3 /* libPods-TomightyTests.a */; }; + C69D84451D7971A000B24643 /* MVTHotkey.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D84441D7971A000B24643 /* MVTHotkey.m */; }; + C69D84481D7971B900B24643 /* MVTHotkeyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D84471D7971B900B24643 /* MVTHotkeyTests.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -176,6 +178,9 @@ 30DB72F918CD54D200293915 /* TYDefaultTomighty.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYDefaultTomighty.m; path = Core/TYDefaultTomighty.m; sourceTree = ""; }; 4E46E0E26D22DDAFC599CB28 /* Pods-TomightyTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TomightyTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TomightyTests/Pods-TomightyTests.debug.xcconfig"; sourceTree = ""; }; 9C134136195EF68DBA17C261 /* Pods-TomightyTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TomightyTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-TomightyTests/Pods-TomightyTests.release.xcconfig"; sourceTree = ""; }; + C69D84431D7971A000B24643 /* MVTHotkey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MVTHotkey.h; path = Core/Hotkey/MVTHotkey.h; sourceTree = ""; }; + C69D84441D7971A000B24643 /* MVTHotkey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MVTHotkey.m; path = Core/Hotkey/MVTHotkey.m; sourceTree = ""; }; + C69D84471D7971B900B24643 /* MVTHotkeyTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MVTHotkeyTests.m; path = Core/Hotkey/MVTHotkeyTests.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -367,6 +372,7 @@ 304AF84918BD117200A2EA74 /* Core */ = { isa = PBXGroup; children = ( + C69D84421D79718500B24643 /* Hotkey */, 3025AE5018D35AA000BC4207 /* Agent */, 3039D2F118C4DF47008689C9 /* Event */, 30415FAF18C51B4D0069FAE3 /* Preferences */, @@ -419,6 +425,7 @@ 309ECB0518C3829700B270BF /* Core */ = { isa = PBXGroup; children = ( + C69D84461D7971AA00B24643 /* Hotkey */, 3025AE5A18D35BAB00BC4207 /* Agent */, 3039D2F618C4DFB0008689C9 /* Event */, 30415FAC18C5105D0069FAE3 /* Preferences */, @@ -491,6 +498,23 @@ name = Pods; sourceTree = ""; }; + C69D84421D79718500B24643 /* Hotkey */ = { + isa = PBXGroup; + children = ( + C69D84431D7971A000B24643 /* MVTHotkey.h */, + C69D84441D7971A000B24643 /* MVTHotkey.m */, + ); + name = Hotkey; + sourceTree = ""; + }; + C69D84461D7971AA00B24643 /* Hotkey */ = { + isa = PBXGroup; + children = ( + C69D84471D7971B900B24643 /* MVTHotkeyTests.m */, + ); + name = Hotkey; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -660,6 +684,7 @@ 304AF82218BD04BE00A2EA74 /* main.m in Sources */, 30B89F9E18C3855600C1DD2B /* TYDefaultTimerContext.m in Sources */, 3025AE5518D35B2B00BC4207 /* TYSoundAgent.m in Sources */, + C69D84451D7971A000B24643 /* MVTHotkey.m in Sources */, 309ECB0418C3828B00B270BF /* TYDefaultSystemTimer.m in Sources */, 3032EEE318C6AF2C00070BD2 /* TYDefaultSoundPlayer.m in Sources */, 300AE29518D1471F00264309 /* TYPreferencesWindowController.m in Sources */, @@ -691,6 +716,7 @@ 30CFBF1218BD76F7000266B4 /* TYMockSystemTimer.m in Sources */, 30C383DC18CFDE8F00FABFFE /* TYAppUITests.m in Sources */, 3025AE5E18D35C0D00BC4207 /* TYUserInterfaceAgentTests.m in Sources */, + C69D84481D7971B900B24643 /* MVTHotkeyTests.m in Sources */, 30BD314318C556EE00428B1E /* TYMockEventBus.m in Sources */, 30415FAE18C5109D0069FAE3 /* TYPreferencesTests.m in Sources */, ); diff --git a/src/Tomighty/Core/Hotkey/MVTHotkey.h b/src/Tomighty/Core/Hotkey/MVTHotkey.h new file mode 100644 index 0000000..a8c16ce --- /dev/null +++ b/src/Tomighty/Core/Hotkey/MVTHotkey.h @@ -0,0 +1,33 @@ +// +// MVTHotkey.h +// Tomighty +// +// Created by Misha Tavkhelidze on 8/27/16. +// Copyright © 2016 Gig Software. All rights reserved. +// + +#import + +@class NSColor; +@class NSFont; +/** + @brief Helper object for MVTHotkeyView + */ +@interface MVTHotkey : NSObject + +@property (readonly) BOOL ctrl; +@property (readonly) BOOL alt; +@property (readonly) BOOL shift; +@property (readonly) BOOL cmd; +@property (nonatomic, assign) SInt32 code; +@property (nonatomic, assign) UInt32 flags; +@property (nonatomic, strong) NSString *string; + ++ (id)hotkeyWithCode:(CGKeyCode)code flags:(UInt32)flags; + +- (NSMutableAttributedString*)mutableAttributedString:(NSFont*)font + textColor:(NSColor*)textColor + inactiveColor:(NSColor*)inactiveColor; +@end + +#define enter(oid) NSLog(@"%s %@", __PRETTY_FUNCTION__, oid) diff --git a/src/Tomighty/Core/Hotkey/MVTHotkey.m b/src/Tomighty/Core/Hotkey/MVTHotkey.m new file mode 100644 index 0000000..d03ebb8 --- /dev/null +++ b/src/Tomighty/Core/Hotkey/MVTHotkey.m @@ -0,0 +1,267 @@ +// +// MVTHotkey.m +// Tomighty +// +// Created by Misha Tavkhelidze on 8/27/16. +// Copyright © 2016 Gig Software. All rights reserved. +// + +#import +#import +#import "MVTHotkey.h" + +static NSString* const MVTControlKeyString = @"^"; +static NSString* const MVTAlternativeKeyString = @"⌥"; +static NSString* const MVTShiftKeyString = @"⇧"; +static NSString* const MVTCommandKeyString = @"⌘"; + +@implementation MVTHotkey { + NSDictionary *_keymap; +} + +#pragma mark Init + ++ (id)hotkeyWithCode:(CGKeyCode)code flags:(UInt32)flags +{ + MVTHotkey *key = [[MVTHotkey alloc] init]; + if(key) { + [key _withCodeAndFlags:code flags:flags]; + } + return key; +} + ++ (id)hotkeyWithString:(NSString*)str +{ + MVTHotkey *key = [[MVTHotkey alloc] init]; + key.string = str; + return key; +} + +- (id)init +{ + self = [super init]; + if(self != nil) + _keymap = [self _makeKeymap]; + return self; +} + +#pragma mark Properties + +- (void)setString:(NSString *)string +{ + _flags = 0; + _code = -1; + for(int i = 0; i < string.length; i++) { + NSString *s = [string substringWithRange:NSMakeRange(i, 1)]; + if([s isEqualToString:MVTControlKeyString]) + _flags |= NSControlKeyMask; + else if([s isEqualToString:MVTAlternativeKeyString]) + _flags |= NSAlternateKeyMask; + else if([s isEqualToString:MVTShiftKeyString]) + _flags |= NSShiftKeyMask; + else if([s isEqualToString:MVTCommandKeyString]) + _flags |= NSCommandKeyMask; + else { + NSString *s = [string + substringWithRange:NSMakeRange(i, string.length - i)]; + _code = [self _stringToKeyCode:s]; + break; + } + } +} + +- (NSString *)string +{ + NSMutableArray *ar = [[NSMutableArray alloc] init]; + if(self.ctrl) + [ar addObject:MVTControlKeyString]; + if(self.alt) + [ar addObject:MVTAlternativeKeyString]; + if(self.shift) + [ar addObject:MVTShiftKeyString]; + if(self.cmd) + [ar addObject:MVTCommandKeyString]; + if([ar count] != 0) { + [ar addObject:[self _keyCodeToString:_code]]; + return [ar componentsJoinedByString:@""]; + } + return nil; +} + + +#pragma mark Helpers + +- (BOOL)ctrl +{ + return _flags & NSControlKeyMask ? TRUE : FALSE; +} + +- (BOOL)alt +{ + return _flags & NSAlternateKeyMask ? TRUE : FALSE; +} + +- (BOOL)shift +{ + return _flags & NSShiftKeyMask ? TRUE : FALSE; +} + +- (BOOL)cmd +{ + return _flags & NSCommandKeyMask ? TRUE : FALSE; +} + +#pragma mark Methods + +- (NSMutableAttributedString*)mutableAttributedString:(NSFont*)font + textColor:(NSColor *)textColor + inactiveColor:(NSColor *)inactiveColor +{ + NSMutableAttributedString *ret = nil; + NSString *str = [NSString stringWithFormat:@"%@%@%@%@%@", + MVTControlKeyString, MVTAlternativeKeyString, + MVTShiftKeyString, MVTCommandKeyString, + [self _keyCodeToString:_code ]]; + + ret = [[NSMutableAttributedString alloc] initWithString:str]; + + if(font) + [ret addAttribute:NSFontAttributeName value:font + range:NSMakeRange(0, str.length)]; + + if(textColor) + [ret addAttribute:NSForegroundColorAttributeName value:textColor + range:NSMakeRange(0, str.length)]; + + if(inactiveColor) { + if(!self.ctrl) + [ret addAttribute:NSForegroundColorAttributeName + value:inactiveColor + range:NSMakeRange(0,MVTControlKeyString.length)]; + if(!self.alt) + [ret addAttribute:NSForegroundColorAttributeName + value:inactiveColor + range:NSMakeRange(1,1)]; + if(!self.shift) + [ret addAttribute:NSForegroundColorAttributeName + value:inactiveColor + range:NSMakeRange(2,1)]; + if(!self.cmd) + [ret addAttribute:NSForegroundColorAttributeName + value:inactiveColor + range:NSMakeRange(3,1)]; + } + return ret; + +} + +- (void)_withCodeAndFlags:(CGKeyCode)code flags:(UInt32)flags +{ + _code = code; + _flags = flags; +} + +- (NSString*)_keyCodeToString:(CGKeyCode)code +{ + return [_keymap objectForKey:@(code)]; +} + +- (SInt32)_stringToKeyCode:(NSString*)str +{ + SInt32 __block ret = -1; + [_keymap keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop) { + *stop = [obj isEqualToString:str] ? YES : NO; + if(stop) ret = [key intValue]; + return *stop; + }]; + return ret; +} + +- (NSDictionary*)_makeKeymap +{ + static dispatch_once_t once; + static NSDictionary *keymap = nil; + dispatch_once (&once, ^{ + keymap = @{ + @(kVK_F1): @"F1", + @(kVK_F2): @"F2", + @(kVK_F3): @"F3", + @(kVK_F4): @"F4", + @(kVK_F5): @"F5", + @(kVK_F6): @"F6", + @(kVK_F7): @"F7", + @(kVK_F8): @"F8", + @(kVK_F9): @"F9", + @(kVK_F10): @"F10", + @(kVK_F11): @"F11", + @(kVK_F12): @"F12", + @(kVK_F13): @"F13", + @(kVK_F14): @"F14", + @(kVK_F15): @"F15", + @(kVK_F16): @"F16", + @(kVK_F17): @"F17", + @(kVK_F18): @"F18", + @(kVK_F19): @"F19", + @(kVK_ANSI_0): @"0", + @(kVK_ANSI_1): @"1", + @(kVK_ANSI_2): @"2", + @(kVK_ANSI_3): @"3", + @(kVK_ANSI_4): @"4", + @(kVK_ANSI_5): @"5", + @(kVK_ANSI_6): @"6", + @(kVK_ANSI_7): @"7", + @(kVK_ANSI_8): @"8", + @(kVK_ANSI_9): @"9", + @(kVK_ANSI_A): @"A", + @(kVK_ANSI_B): @"B", + @(kVK_ANSI_C): @"C", + @(kVK_ANSI_D): @"D", + @(kVK_ANSI_E): @"E", + @(kVK_ANSI_F): @"F", + @(kVK_ANSI_G): @"G", + @(kVK_ANSI_H): @"H", + @(kVK_ANSI_I): @"I", + @(kVK_ANSI_J): @"J", + @(kVK_ANSI_K): @"K", + @(kVK_ANSI_L): @"L", + @(kVK_ANSI_M): @"M", + @(kVK_ANSI_N): @"N", + @(kVK_ANSI_O): @"O", + @(kVK_ANSI_P): @"P", + @(kVK_ANSI_Q): @"Q", + @(kVK_ANSI_R): @"R", + @(kVK_ANSI_S): @"S", + @(kVK_ANSI_T): @"T", + @(kVK_ANSI_U): @"U", + @(kVK_ANSI_V): @"V", + @(kVK_ANSI_W): @"W", + @(kVK_ANSI_X): @"X", + @(kVK_ANSI_Y): @"Y", + @(kVK_ANSI_Z): @"Z", + @(kVK_ANSI_Grave): @"`", + @(kVK_ANSI_Minus): @"-", + @(kVK_ANSI_Equal): @"=", + @(kVK_Delete): @"Delete", + @(kVK_ANSI_LeftBracket): @"[", + @(kVK_ANSI_RightBracket): @"]", + @(kVK_ANSI_Backslash): @"\\", + @(kVK_ANSI_RightBracket): @"]", + @(kVK_CapsLock): @"Capslock", + @(kVK_ANSI_Semicolon): @";", + @(kVK_ANSI_Quote): @"'", + @(kVK_ANSI_Comma): @",", + @(kVK_ANSI_Period): @".", + @(kVK_ANSI_Slash): @"/", + @(kVK_Space): @"Space", + @(kVK_LeftArrow): @"←", + @(kVK_DownArrow): @"↓", + @(kVK_RightArrow): @"→", + @(kVK_UpArrow): @"↑", + @(kVK_Return): @"Enter", + @(kVK_Escape): @"Escape" + }; + }); + return keymap; +} + +@end diff --git a/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m b/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m new file mode 100644 index 0000000..c2d5254 --- /dev/null +++ b/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m @@ -0,0 +1,96 @@ +// +// MVTHotkey.m +// Tomighty +// +// Created by Misha Tavkhelidze on 8/27/16. +// Copyright © 2016 Gig Software. All rights reserved. +// + +#import +#import +#import "MVTHotkey.h" + +@interface MVTHotkeyTests : XCTestCase { + MVTHotkey *key; +} + +@end + +@implementation MVTHotkeyTests + +- (void)setUp { + [super setUp]; + // ⇧⌘S + key = [MVTHotkey hotkeyWithCode:0x1 + flags:(0 | NSCommandKeyMask | NSShiftKeyMask)]; +} + +- (void)tearDown { + [super tearDown]; +} + +- (void)test_should_have_command { + XCTAssertTrue(key.cmd); +} + +- (void)test_should_have_shift { + XCTAssertTrue(key.shift); +} + +- (void)test_should_not_have_alt { + XCTAssertFalse(key.alt); +} + +- (void)test_should_not_have_control { + XCTAssertFalse(key.ctrl); +} + +- (void)test_should_have_correct_code { + XCTAssertTrue(key.code == 0x1); +} + +- (void)test_should_have_correct_string { + XCTAssertTrue([key.string isEqualToString:@"⇧⌘S"]); +} + +- (void)test_should_return_full_attributed_string +{ + NSAttributedString *str = [key mutableAttributedString:nil + textColor:[NSColor redColor] + inactiveColor:nil]; + XCTAssertTrue([str.string isEqualToString:@"^⌥⇧⌘S"]); +} + +- (void)test_should_set_color_to_active_key { + NSAttributedString *str = [key mutableAttributedString:nil + textColor:[NSColor redColor] + inactiveColor:[NSColor greenColor]]; + NSDictionary *attr = [str attributesAtIndex:4 effectiveRange:nil]; + XCTAssertTrue([[attr objectForKey:NSForegroundColorAttributeName] + isEqual:[NSColor redColor]]); +} + +- (void)test_should_set_color_to_active_modifier { + NSAttributedString *str = [key mutableAttributedString:nil + textColor:[NSColor redColor] + inactiveColor:[NSColor greenColor]]; + NSDictionary *attr = [str attributesAtIndex:3 effectiveRange:nil]; + XCTAssertTrue([[attr objectForKey:NSForegroundColorAttributeName] + isEqual:[NSColor redColor]]); +} + +- (void)test_should_set_inactive_color_to_inactive_modifier { + NSAttributedString *str = [key mutableAttributedString:nil + textColor:[NSColor redColor] + inactiveColor:[NSColor greenColor]]; + NSDictionary *attr = [str attributesAtIndex:0 effectiveRange:nil]; + XCTAssertTrue([[attr objectForKey:NSForegroundColorAttributeName] + isEqual:[NSColor greenColor]]); +} + +- (void)test_should_parse_string_correctly { + key.string = @"^D"; + XCTAssertTrue(key.ctrl && key.code == 2); +} + +@end From cf0ba8fa91a78b659167b595e532e288499b311e Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Fri, 2 Sep 2016 15:55:27 +0400 Subject: [PATCH 05/32] Add hotkey view control --- src/Tomighty.xcodeproj/project.pbxproj | 14 +++- src/Tomighty/Core/Hotkey/MVTHotkey.h | 10 +++ src/Tomighty/Core/Hotkey/MVTHotkeyCell.h | 15 ++++ src/Tomighty/Core/Hotkey/MVTHotkeyCell.m | 26 ++++++ src/Tomighty/Core/Hotkey/MVTHotkeyControl.h | 27 +++++++ src/Tomighty/Core/Hotkey/MVTHotkeyControl.m | 90 +++++++++++++++++++++ 6 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 src/Tomighty/Core/Hotkey/MVTHotkeyCell.h create mode 100644 src/Tomighty/Core/Hotkey/MVTHotkeyCell.m create mode 100644 src/Tomighty/Core/Hotkey/MVTHotkeyControl.h create mode 100644 src/Tomighty/Core/Hotkey/MVTHotkeyControl.m diff --git a/src/Tomighty.xcodeproj/project.pbxproj b/src/Tomighty.xcodeproj/project.pbxproj index 7ebf5f6..b2d4bda 100644 --- a/src/Tomighty.xcodeproj/project.pbxproj +++ b/src/Tomighty.xcodeproj/project.pbxproj @@ -62,6 +62,8 @@ 88742E1C44894488BB0F167C /* libPods-TomightyTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B1A27968CA44FEFB1DA3DB3 /* libPods-TomightyTests.a */; }; C69D84451D7971A000B24643 /* MVTHotkey.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D84441D7971A000B24643 /* MVTHotkey.m */; }; C69D84481D7971B900B24643 /* MVTHotkeyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D84471D7971B900B24643 /* MVTHotkeyTests.m */; }; + C69D844D1D79722600B24643 /* MVTHotkeyCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D844A1D79722600B24643 /* MVTHotkeyCell.m */; }; + C69D844E1D79722600B24643 /* MVTHotkeyControl.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D844C1D79722600B24643 /* MVTHotkeyControl.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -181,6 +183,10 @@ C69D84431D7971A000B24643 /* MVTHotkey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MVTHotkey.h; path = Core/Hotkey/MVTHotkey.h; sourceTree = ""; }; C69D84441D7971A000B24643 /* MVTHotkey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MVTHotkey.m; path = Core/Hotkey/MVTHotkey.m; sourceTree = ""; }; C69D84471D7971B900B24643 /* MVTHotkeyTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MVTHotkeyTests.m; path = Core/Hotkey/MVTHotkeyTests.m; sourceTree = ""; }; + C69D84491D79722600B24643 /* MVTHotkeyCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MVTHotkeyCell.h; path = Core/Hotkey/MVTHotkeyCell.h; sourceTree = ""; }; + C69D844A1D79722600B24643 /* MVTHotkeyCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MVTHotkeyCell.m; path = Core/Hotkey/MVTHotkeyCell.m; sourceTree = ""; }; + C69D844B1D79722600B24643 /* MVTHotkeyControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MVTHotkeyControl.h; path = Core/Hotkey/MVTHotkeyControl.h; sourceTree = ""; }; + C69D844C1D79722600B24643 /* MVTHotkeyControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MVTHotkeyControl.m; path = Core/Hotkey/MVTHotkeyControl.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -334,6 +340,7 @@ 300AE29018D1444400264309 /* PreferencesWindow.xib */, 304AF82D18BD04BE00A2EA74 /* Images.xcassets */, 304AF81C18BD04BE00A2EA74 /* Supporting Files */, + C69D84421D79718500B24643 /* Hotkey */, ); path = Tomighty; sourceTree = ""; @@ -372,7 +379,6 @@ 304AF84918BD117200A2EA74 /* Core */ = { isa = PBXGroup; children = ( - C69D84421D79718500B24643 /* Hotkey */, 3025AE5018D35AA000BC4207 /* Agent */, 3039D2F118C4DF47008689C9 /* Event */, 30415FAF18C51B4D0069FAE3 /* Preferences */, @@ -503,6 +509,10 @@ children = ( C69D84431D7971A000B24643 /* MVTHotkey.h */, C69D84441D7971A000B24643 /* MVTHotkey.m */, + C69D84491D79722600B24643 /* MVTHotkeyCell.h */, + C69D844A1D79722600B24643 /* MVTHotkeyCell.m */, + C69D844B1D79722600B24643 /* MVTHotkeyControl.h */, + C69D844C1D79722600B24643 /* MVTHotkeyControl.m */, ); name = Hotkey; sourceTree = ""; @@ -687,9 +697,11 @@ C69D84451D7971A000B24643 /* MVTHotkey.m in Sources */, 309ECB0418C3828B00B270BF /* TYDefaultSystemTimer.m in Sources */, 3032EEE318C6AF2C00070BD2 /* TYDefaultSoundPlayer.m in Sources */, + C69D844E1D79722600B24643 /* MVTHotkeyControl.m in Sources */, 300AE29518D1471F00264309 /* TYPreferencesWindowController.m in Sources */, 30DB72FA18CD54D200293915 /* TYDefaultTomighty.m in Sources */, 301A007918BD417200B8DEE0 /* TYDefaultTimer.m in Sources */, + C69D844D1D79722600B24643 /* MVTHotkeyCell.m in Sources */, 309394E718D0C76100D6C71A /* TYDefaultStatusIcon.m in Sources */, 30C383E018CFE02100FABFFE /* TYDefaultAppUI.m in Sources */, 30415FB618C51C290069FAE3 /* TYUserDefaultsPreferences.m in Sources */, diff --git a/src/Tomighty/Core/Hotkey/MVTHotkey.h b/src/Tomighty/Core/Hotkey/MVTHotkey.h index a8c16ce..a543a08 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkey.h +++ b/src/Tomighty/Core/Hotkey/MVTHotkey.h @@ -10,6 +10,16 @@ @class NSColor; @class NSFont; +@class MVTHotkey; + +@protocol MVTHotkeyView + +- (void)setHotkey:(MVTHotkey*)hotkey; + +@optional +- (MVTHotkey*)hotkey; + +@end /** @brief Helper object for MVTHotkeyView */ diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyCell.h b/src/Tomighty/Core/Hotkey/MVTHotkeyCell.h new file mode 100644 index 0000000..ad4b4b4 --- /dev/null +++ b/src/Tomighty/Core/Hotkey/MVTHotkeyCell.h @@ -0,0 +1,15 @@ +// +// MVTHotkeyCell.h +// MVTHotkeyViewApp +// +// Created by Misha Tavkhelidze on 8/28/16. +// Copyright © 2016 Misha Tavkhelidze. All rights reserved. +// + +#import "MVTHotkey.h" + +@interface MVTHotkeyCell : NSTextFieldCell + +- (void)setHotkey:(MVTHotkey*)key; + +@end diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m b/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m new file mode 100644 index 0000000..a2d7c11 --- /dev/null +++ b/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m @@ -0,0 +1,26 @@ +// +// MVTHotkeyCell.m +// MVTHotkeyViewApp +// +// Created by Misha Tavkhelidze on 8/28/16. +// Copyright © 2016 Misha Tavkhelidze. All rights reserved. +// + +#import "MVTHotkey.h" +#import "MVTHotkeyCell.h" + +@implementation MVTHotkeyCell + +- (void)setHotkey:(MVTHotkey*)key +{ + NSMutableParagraphStyle *ps = [[NSMutableParagraphStyle alloc] init]; + ps.alignment = self.alignment; + NSMutableAttributedString *as; + as = [key mutableAttributedString:self.font + textColor:self.textColor + inactiveColor:[NSColor controlHighlightColor]]; + [as addAttribute:NSParagraphStyleAttributeName value:ps range:NSMakeRange(0, as.length)]; + [self setAttributedStringValue:as]; +} + +@end diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyControl.h b/src/Tomighty/Core/Hotkey/MVTHotkeyControl.h new file mode 100644 index 0000000..581eeda --- /dev/null +++ b/src/Tomighty/Core/Hotkey/MVTHotkeyControl.h @@ -0,0 +1,27 @@ +// +// MVTHotkeyView.h +// +// Created by Misha Tavkhelidze . +// Copyright © 2016 Misha Tavkhelidze. All rights reserved. +// + +#import "MVTHotkey.h" + +/** + @brief NSView subclass for capturing user clicked hotkeys + + @discussion When activated, this view listens to keyboard events and records + the keystroke. Pressed keys are highlighted. + + To use this class in IB select CustomView object from the library, plase + it in your window and assign MVTHotkeyView as a class to it. + + @remarks To be able capture Command (⌘) key controlling NSApplication's + sendAction must be overriden. + + MVTHotkeyView ignores Tab, because it's used in navigation. + +*/ +@interface MVTHotkeyControl : NSControl +@property (nonatomic, strong) MVTHotkey* hotkey; +@end diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m b/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m new file mode 100644 index 0000000..4121e23 --- /dev/null +++ b/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m @@ -0,0 +1,90 @@ +// +// MVTHotkeyView.m +// +// Created by Misha Tavkhelidze +// Copyright © 2016 Misha Tavkhelidze. All rights reserved. +// + +#import +#import "MVTHotkeyControl.h" +#import "MVTHotkeyCell.h" +#import "MVTHotkey.h" + +IB_DESIGNABLE + +@implementation MVTHotkeyControl { + BOOL _key_valid; + MVTHotkey *_key; +} + +#pragma mark Initialization + +/// Sets control defaults. Those can be overriden in IB +- (void)setDefaults +{ + _key = nil; + _key_valid = FALSE; +} + +- (id)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + + if(self != nil) { + [self setDefaults]; + } + + return self; +} + +- (id)initWithCoder:(NSCoder *)coder { + self = [super initWithCoder:coder]; + + if(self != nil) { + [self setDefaults]; + } + + return self; +} + +#pragma mark Properties +- (void)setHotkey:(MVTHotkey*)hotkey +{ + if([self isKeyValid:hotkey]) { + _key = hotkey; + [_cell setHotkey:_key]; + } +} + +- (MVTHotkey*)hotkey +{ + return _key; +} + +#pragma mark Responders + +- (void)keyDown:(NSEvent *)theEvent +{ + enter(nil); + _key = [MVTHotkey hotkeyWithCode:[theEvent keyCode] flags:theEvent.modifierFlags]; + if([self isKeyValid:_key]) { + [_cell setHotkey:_key]; + [self sendAction:self.action to:self.target]; + } else + [[super window] keyDown:theEvent]; +} + +- (void)mouseDown:(NSEvent *)theEvent +{ + // Prevent background redraw by doing nothing. +} + +#pragma mark Utilities +- (BOOL)isKeyValid:(MVTHotkey*)key +{ + return + (_key.ctrl || _key.alt || _key.shift || _key.cmd) && + (_key.code != kVK_Tab) ? TRUE : FALSE; + +} + +@end From 5a3cd8fbea29de1d33c058caa7f24e111309a0be Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Fri, 2 Sep 2016 16:07:28 +0400 Subject: [PATCH 06/32] Add Hotkeys tab to preferences UI --- src/Tomighty/Base.lproj/PreferencesWindow.xib | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/Tomighty/Base.lproj/PreferencesWindow.xib b/src/Tomighty/Base.lproj/PreferencesWindow.xib index e537f09..240033c 100644 --- a/src/Tomighty/Base.lproj/PreferencesWindow.xib +++ b/src/Tomighty/Base.lproj/PreferencesWindow.xib @@ -23,7 +23,7 @@ - + @@ -261,6 +261,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 0195669f7817e275ab3dadff5ebf543efcd0bd8e Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Fri, 2 Sep 2016 16:35:40 +0400 Subject: [PATCH 07/32] Add get/set string to preferences --- src/Tomighty/Core/Hotkey/MVTHotkeyCell.m | 3 ++- src/Tomighty/Core/Preferences/TYPreferences.h | 5 ++++- .../Preferences/TYUserDefaultsPreferences.m | 16 ++++++++++++++++ .../Core/Preferences/TYPreferencesTests.m | 17 +++++++++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m b/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m index a2d7c11..41c159f 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m +++ b/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m @@ -19,7 +19,8 @@ - (void)setHotkey:(MVTHotkey*)key as = [key mutableAttributedString:self.font textColor:self.textColor inactiveColor:[NSColor controlHighlightColor]]; - [as addAttribute:NSParagraphStyleAttributeName value:ps range:NSMakeRange(0, as.length)]; + [as addAttribute:NSParagraphStyleAttributeName value:ps + range:NSMakeRange(0, as.length)]; [self setAttributedStringValue:as]; } diff --git a/src/Tomighty/Core/Preferences/TYPreferences.h b/src/Tomighty/Core/Preferences/TYPreferences.h index 7a794a7..37d8cb2 100644 --- a/src/Tomighty/Core/Preferences/TYPreferences.h +++ b/src/Tomighty/Core/Preferences/TYPreferences.h @@ -14,10 +14,13 @@ extern NSString * const PREF_PLAY_SOUND_WHEN_TIMER_STARTS; extern NSString * const PREF_PLAY_SOUND_WHEN_TIMER_GOES_OFF; extern NSString * const PREF_PLAY_TICKTOCK_SOUND_DURING_POMODORO; extern NSString * const PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK; +extern NSString * const PREF_HOTKEY_START; +extern NSString * const PREF_HOTKEY_STOP; @protocol TYPreferences - (int)getInt:(NSString *)key; +- (NSString*)getString:(NSString *)key; - (void)setInt:(NSString *)key value:(int)value; - +- (void)setString:(NSString *)key value:(NSString*)value; @end diff --git a/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m b/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m index 092ab89..9f00d90 100644 --- a/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m +++ b/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m @@ -15,6 +15,8 @@ NSString * const PREF_PLAY_SOUND_WHEN_TIMER_GOES_OFF = @"org.tomighty.sound.play_on_timer_stop"; NSString * const PREF_PLAY_TICKTOCK_SOUND_DURING_POMODORO = @"org.tomighty.sound.play_tick_tock_during_pomodoro"; NSString * const PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK = @"org.tomighty.sound.play_tick_tock_during_break"; +NSString * const PREF_HOTKEY_START = @"org.tomighty.hotkey.start"; +NSString * const PREF_HOTKEY_STOP = @"org.tomighty.hotkey.stop"; @implementation TYUserDefaultsPreferences { @@ -58,4 +60,18 @@ - (void)setInt:(NSString *)key value:(int)value } } +- (NSString*)getString:(NSString*)key +{ + return (NSString*)[[NSUserDefaults standardUserDefaults] objectForKey:key]; +} + +- (void)setString:(NSString *)key value:(NSString *)value +{ + NSString *v = [self getString:key]; + NSLog(@"%@ %@", v, value); + if(![v isEqualToString:value]) { + [[NSUserDefaults standardUserDefaults] setObject:value forKey:key]; + [eventBus publish:PREFERENCE_CHANGE data:key]; + } +} @end diff --git a/src/TomightyTests/Core/Preferences/TYPreferencesTests.m b/src/TomightyTests/Core/Preferences/TYPreferencesTests.m index cd42835..c5c5127 100644 --- a/src/TomightyTests/Core/Preferences/TYPreferencesTests.m +++ b/src/TomightyTests/Core/Preferences/TYPreferencesTests.m @@ -71,6 +71,23 @@ - (void)test_set_and_get_integer_value XCTAssertEqual([preferences getInt:PREF_TIME_POMODORO], 123); } +- (void)test_set_and_get_string_value +{ + [preferences setString:PREF_HOTKEY_START value:@"start"]; + XCTAssertTrue([@"start" isEqualToString:[preferences + getString:PREF_HOTKEY_START]]); +} + +- (void)test_fire_event_when_string_value_changes_on_set +{ + [preferences setString:PREF_HOTKEY_STOP value:@"stop"]; + + XCTAssertEqual([eventBus getPublishedEventCount], (NSUInteger)1); + XCTAssertTrue([eventBus hasPublishedEvent:PREFERENCE_CHANGE + withData:PREF_HOTKEY_STOP + atPosition:1]); +} + - (void)test_fire_event_when_integer_value_changes_on_set { [preferences setInt:PREF_TIME_POMODORO value:987]; From 512a29a093589410b0efaa2f3a35a9f949e3dbb6 Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Fri, 2 Sep 2016 16:36:48 +0400 Subject: [PATCH 08/32] Get rid of stray NSLog --- src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m b/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m index 9f00d90..b75f244 100644 --- a/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m +++ b/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m @@ -68,7 +68,6 @@ - (NSString*)getString:(NSString*)key - (void)setString:(NSString *)key value:(NSString *)value { NSString *v = [self getString:key]; - NSLog(@"%@ %@", v, value); if(![v isEqualToString:value]) { [[NSUserDefaults standardUserDefaults] setObject:value forKey:key]; [eventBus publish:PREFERENCE_CHANGE data:key]; From 93553c4d334c6b26d1f0dd35b95a4ef7988ff347 Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sat, 3 Sep 2016 13:28:12 +0400 Subject: [PATCH 09/32] Add better invalid key handling. --- src/Tomighty/Core/Hotkey/MVTHotkey.h | 2 ++ src/Tomighty/Core/Hotkey/MVTHotkey.m | 19 +++++++--- .../Core/Hotkey/MVTHotkeyTests.m | 35 +++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/Tomighty/Core/Hotkey/MVTHotkey.h b/src/Tomighty/Core/Hotkey/MVTHotkey.h index a543a08..b2d5f30 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkey.h +++ b/src/Tomighty/Core/Hotkey/MVTHotkey.h @@ -29,11 +29,13 @@ @property (readonly) BOOL alt; @property (readonly) BOOL shift; @property (readonly) BOOL cmd; +@property (readonly) BOOL valid; @property (nonatomic, assign) SInt32 code; @property (nonatomic, assign) UInt32 flags; @property (nonatomic, strong) NSString *string; + (id)hotkeyWithCode:(CGKeyCode)code flags:(UInt32)flags; ++ (id)hotkeyWithString:(NSString*)string; - (NSMutableAttributedString*)mutableAttributedString:(NSFont*)font textColor:(NSColor*)textColor diff --git a/src/Tomighty/Core/Hotkey/MVTHotkey.m b/src/Tomighty/Core/Hotkey/MVTHotkey.m index d03ebb8..aa703d3 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkey.m +++ b/src/Tomighty/Core/Hotkey/MVTHotkey.m @@ -68,6 +68,10 @@ - (void)setString:(NSString *)string break; } } + if(![self valid]) { + _code = -1; + _flags = -1; + } } - (NSString *)string @@ -81,16 +85,13 @@ - (NSString *)string [ar addObject:MVTShiftKeyString]; if(self.cmd) [ar addObject:MVTCommandKeyString]; - if([ar count] != 0) { + if([ar count] != 0 && _code != -1) { [ar addObject:[self _keyCodeToString:_code]]; return [ar componentsJoinedByString:@""]; } return nil; } - -#pragma mark Helpers - - (BOOL)ctrl { return _flags & NSControlKeyMask ? TRUE : FALSE; @@ -111,6 +112,12 @@ - (BOOL)cmd return _flags & NSCommandKeyMask ? TRUE : FALSE; } +- (BOOL)valid +{ + return (([self ctrl] || [self alt] || [self shift] || [self cmd]) && + (_code != -1 && _code != kVK_Tab)); +} + #pragma mark Methods - (NSMutableAttributedString*)mutableAttributedString:(NSFont*)font @@ -159,6 +166,10 @@ - (void)_withCodeAndFlags:(CGKeyCode)code flags:(UInt32)flags { _code = code; _flags = flags; + if(![self valid]) { + _code = -1; + _flags = -1; + } } - (NSString*)_keyCodeToString:(CGKeyCode)code diff --git a/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m b/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m index c2d5254..0609626 100644 --- a/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m +++ b/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m @@ -93,4 +93,39 @@ - (void)test_should_parse_string_correctly { XCTAssertTrue(key.ctrl && key.code == 2); } +- (void)test_should_report_invalid_without_key_code { + key.string = @"^"; + XCTAssertFalse(key.valid); +} + +- (void)test_should_report_invalid_if_tab { + key = [MVTHotkey hotkeyWithCode:kVK_Tab + flags:(0 | NSCommandKeyMask)]; + XCTAssertFalse(key.valid); +} + +- (void)test_should_report_invalid_if_no_modifier +{ + key = [MVTHotkey hotkeyWithCode:0x1 flags:0]; + XCTAssertFalse(key.valid); +} + +- (void)test_should_have_code_minum_one_if_invalid +{ + key.string = @"R"; + XCTAssertTrue(key.code == -1); +} + +- (void)test_should_have_flags_minus_one_if_invalid +{ + key.string = @""; + XCTAssertTrue(key.flags == -1); +} + +- (void)test_string_should_return_nil_if_invalid +{ + key.string = @""; + XCTAssertTrue(key.string == nil); +} + @end From 67b30d94b5c51baab1a8b97d3423576534aa7b3f Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sat, 3 Sep 2016 13:32:40 +0400 Subject: [PATCH 10/32] Add default hotkey values to prefs. --- src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m | 6 ++++-- src/TomightyTests/Core/Preferences/TYPreferencesTests.m | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m b/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m index b75f244..5017dfc 100644 --- a/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m +++ b/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m @@ -39,7 +39,8 @@ - (id)initWith:(id )anEventBus [defaultValues setObject:[NSNumber numberWithInt:true] forKey:PREF_PLAY_SOUND_WHEN_TIMER_GOES_OFF]; [defaultValues setObject:[NSNumber numberWithInt:true] forKey:PREF_PLAY_TICKTOCK_SOUND_DURING_POMODORO]; [defaultValues setObject:[NSNumber numberWithInt:true] forKey:PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK]; - + [defaultValues setObject:@"^⌘P" forKey:PREF_HOTKEY_START]; + [defaultValues setObject:@"^⌘S" forKey:PREF_HOTKEY_STOP]; [[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues]; } return self; @@ -62,7 +63,8 @@ - (void)setInt:(NSString *)key value:(int)value - (NSString*)getString:(NSString*)key { - return (NSString*)[[NSUserDefaults standardUserDefaults] objectForKey:key]; + NSString *ret = [[NSUserDefaults standardUserDefaults] objectForKey:key]; + return ret; } - (void)setString:(NSString *)key value:(NSString *)value diff --git a/src/TomightyTests/Core/Preferences/TYPreferencesTests.m b/src/TomightyTests/Core/Preferences/TYPreferencesTests.m index c5c5127..51de196 100644 --- a/src/TomightyTests/Core/Preferences/TYPreferencesTests.m +++ b/src/TomightyTests/Core/Preferences/TYPreferencesTests.m @@ -73,14 +73,14 @@ - (void)test_set_and_get_integer_value - (void)test_set_and_get_string_value { - [preferences setString:PREF_HOTKEY_START value:@"start"]; - XCTAssertTrue([@"start" isEqualToString:[preferences + [preferences setString:PREF_HOTKEY_START value:@"^⌘P"]; + XCTAssertTrue([@"^⌘P" isEqualToString:[preferences getString:PREF_HOTKEY_START]]); } - (void)test_fire_event_when_string_value_changes_on_set { - [preferences setString:PREF_HOTKEY_STOP value:@"stop"]; + [preferences setString:PREF_HOTKEY_STOP value:@"^⌘S"]; XCTAssertEqual([eventBus getPublishedEventCount], (NSUInteger)1); XCTAssertTrue([eventBus hasPublishedEvent:PREFERENCE_CHANGE From 8cd696c5e13404d13ae78e882bce4cdf38bafe37 Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sat, 3 Sep 2016 13:34:28 +0400 Subject: [PATCH 11/32] Add hotkey preferences outlets and default values to controller. --- src/Tomighty/Base.lproj/PreferencesWindow.xib | 2 ++ src/Tomighty/Core/UI/TYPreferencesWindowController.h | 3 +++ src/Tomighty/Core/UI/TYPreferencesWindowController.m | 6 ++++++ 3 files changed, 11 insertions(+) diff --git a/src/Tomighty/Base.lproj/PreferencesWindow.xib b/src/Tomighty/Base.lproj/PreferencesWindow.xib index 240033c..b61de85 100644 --- a/src/Tomighty/Base.lproj/PreferencesWindow.xib +++ b/src/Tomighty/Base.lproj/PreferencesWindow.xib @@ -12,6 +12,8 @@ + + diff --git a/src/Tomighty/Core/UI/TYPreferencesWindowController.h b/src/Tomighty/Core/UI/TYPreferencesWindowController.h index c64ac49..64a8e2d 100644 --- a/src/Tomighty/Core/UI/TYPreferencesWindowController.h +++ b/src/Tomighty/Core/UI/TYPreferencesWindowController.h @@ -7,6 +7,7 @@ // #import +#import "MVTHotkeyControl.h" @interface TYPreferencesWindowController : NSWindowController @@ -19,6 +20,8 @@ @property (weak) IBOutlet NSButton *check_play_sound_when_timer_goes_off; @property (weak) IBOutlet NSButton *check_play_ticktock_sound_during_pomodoro; @property (weak) IBOutlet NSButton *check_play_ticktock_sound_during_break; +@property (weak) IBOutlet MVTHotkeyControl *text_hotkey_start; +@property (weak) IBOutlet MVTHotkeyControl *text_hotkey_stop; - (IBAction)save_time_pomodoro:(id)sender; - (IBAction)save_time_short_break:(id)sender; diff --git a/src/Tomighty/Core/UI/TYPreferencesWindowController.m b/src/Tomighty/Core/UI/TYPreferencesWindowController.m index 0abcfd1..717f01b 100644 --- a/src/Tomighty/Core/UI/TYPreferencesWindowController.m +++ b/src/Tomighty/Core/UI/TYPreferencesWindowController.m @@ -37,6 +37,12 @@ - (void)windowDidLoad [self.check_play_sound_when_timer_goes_off setState:[preferences getInt:PREF_PLAY_SOUND_WHEN_TIMER_GOES_OFF]]; [self.check_play_ticktock_sound_during_pomodoro setState:[preferences getInt:PREF_PLAY_TICKTOCK_SOUND_DURING_POMODORO]]; [self.check_play_ticktock_sound_during_break setState:[preferences getInt:PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK]]; + [self.text_hotkey_start + setHotkey:[MVTHotkey hotkeyWithString:[preferences + getString:PREF_HOTKEY_START]]]; + [self.text_hotkey_stop + setHotkey:[MVTHotkey hotkeyWithString:[preferences + getString:PREF_HOTKEY_STOP]]]; } - (void)windowWillClose:(NSNotification *)notification { From fe3aff8e68be1922c79137551134a7f0d83c9a5d Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sat, 3 Sep 2016 13:35:22 +0400 Subject: [PATCH 12/32] Move valid check to MVTHotkey. --- src/Tomighty/Core/Hotkey/MVTHotkeyControl.m | 23 ++++++--------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m b/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m index 4121e23..7c4beb7 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m +++ b/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m @@ -23,7 +23,6 @@ @implementation MVTHotkeyControl { - (void)setDefaults { _key = nil; - _key_valid = FALSE; } - (id)initWithFrame:(CGRect)frame { @@ -49,9 +48,10 @@ - (id)initWithCoder:(NSCoder *)coder { #pragma mark Properties - (void)setHotkey:(MVTHotkey*)hotkey { - if([self isKeyValid:hotkey]) { + if(hotkey.valid) { _key = hotkey; [_cell setHotkey:_key]; + [self sendAction:self.action to:self.target]; } } @@ -64,12 +64,10 @@ - (MVTHotkey*)hotkey - (void)keyDown:(NSEvent *)theEvent { - enter(nil); - _key = [MVTHotkey hotkeyWithCode:[theEvent keyCode] flags:theEvent.modifierFlags]; - if([self isKeyValid:_key]) { - [_cell setHotkey:_key]; - [self sendAction:self.action to:self.target]; - } else + MVTHotkey *key = [MVTHotkey hotkeyWithCode:[theEvent keyCode] flags:theEvent.modifierFlags]; + if(key.valid) + [self setHotkey:key]; + else [[super window] keyDown:theEvent]; } @@ -78,13 +76,4 @@ - (void)mouseDown:(NSEvent *)theEvent // Prevent background redraw by doing nothing. } -#pragma mark Utilities -- (BOOL)isKeyValid:(MVTHotkey*)key -{ - return - (_key.ctrl || _key.alt || _key.shift || _key.cmd) && - (_key.code != kVK_Tab) ? TRUE : FALSE; - -} - @end From d0e683b6f9addb5b74959f9eae6b7a4b5fd75aa4 Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sat, 3 Sep 2016 13:43:53 +0400 Subject: [PATCH 13/32] Add actual saving of hotkeys into preferences. --- src/Tomighty/Base.lproj/PreferencesWindow.xib | 6 ++++++ .../Core/UI/TYPreferencesWindowController.h | 2 ++ .../Core/UI/TYPreferencesWindowController.m | 16 ++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/src/Tomighty/Base.lproj/PreferencesWindow.xib b/src/Tomighty/Base.lproj/PreferencesWindow.xib index b61de85..ee3a274 100644 --- a/src/Tomighty/Base.lproj/PreferencesWindow.xib +++ b/src/Tomighty/Base.lproj/PreferencesWindow.xib @@ -291,6 +291,9 @@ + + + @@ -307,6 +310,9 @@ + + + diff --git a/src/Tomighty/Core/UI/TYPreferencesWindowController.h b/src/Tomighty/Core/UI/TYPreferencesWindowController.h index 64a8e2d..243c061 100644 --- a/src/Tomighty/Core/UI/TYPreferencesWindowController.h +++ b/src/Tomighty/Core/UI/TYPreferencesWindowController.h @@ -30,5 +30,7 @@ - (IBAction)save_play_sound_when_timer_goes_off:(id)sender; - (IBAction)save_play_ticktock_sound_during_pomodoro:(id)sender; - (IBAction)save_play_ticktock_sound_during_break:(id)sender; +- (IBAction)save_hotkey_start:(id)sender; +- (IBAction)save_hotkey_stop:(id)sender; @end diff --git a/src/Tomighty/Core/UI/TYPreferencesWindowController.m b/src/Tomighty/Core/UI/TYPreferencesWindowController.m index 717f01b..81d40b3 100644 --- a/src/Tomighty/Core/UI/TYPreferencesWindowController.m +++ b/src/Tomighty/Core/UI/TYPreferencesWindowController.m @@ -78,4 +78,20 @@ - (IBAction)save_play_ticktock_sound_during_break:(id)sender { [preferences setInt:PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK value:(int)[self.check_play_ticktock_sound_during_break state]]; } +- (IBAction)save_hotkey_start:(id)sender +{ + // Note that we don't use [_t.. stringValue] because it'll return the key + // with all modifiers, not just those which are pressed + [preferences setString:PREF_HOTKEY_START + value:_text_hotkey_start.hotkey.string]; +} + +- (IBAction)save_hotkey_stop:(id)sender +{ + // Note that we don't use [_t.. stringValue] because it'll return the key + // with all modifiers, not just those which are pressed + [preferences setString:PREF_HOTKEY_STOP + value:_text_hotkey_stop.hotkey.string]; +} + @end From aff40af8e7defb18e5b2312981b97247885d140c Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sat, 3 Sep 2016 13:52:18 +0400 Subject: [PATCH 14/32] Add preference change event subscriber. --- src/Tomighty/Core/Agent/TYUserInterfaceAgent.m | 5 +++++ src/Tomighty/Core/UI/TYAppUI.h | 1 + src/Tomighty/Core/UI/TYDefaultAppUI.m | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m b/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m index c25c752..d314371 100644 --- a/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m +++ b/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m @@ -56,6 +56,11 @@ - (void)updateAppUiInResponseToEventsFrom:(id )eventBus NSNumber *pomodoroCount = eventData; [ui updatePomodoroCount:[pomodoroCount intValue]]; }]; + + [eventBus subscribeTo:PREFERENCE_CHANGE subscriber:^(id eventData) { + NSString *pref = eventData; + [ui handlePrerencesChange:pref]; + }]; } @end diff --git a/src/Tomighty/Core/UI/TYAppUI.h b/src/Tomighty/Core/UI/TYAppUI.h index f5bddec..52ec6c2 100644 --- a/src/Tomighty/Core/UI/TYAppUI.h +++ b/src/Tomighty/Core/UI/TYAppUI.h @@ -15,5 +15,6 @@ - (void)switchToLongBreakState; - (void)updateRemainingTime:(int)remainingSeconds; - (void)updatePomodoroCount:(int)count; +- (void)handlePrerencesChange:(NSString*)which; @end diff --git a/src/Tomighty/Core/UI/TYDefaultAppUI.m b/src/Tomighty/Core/UI/TYDefaultAppUI.m index 141dcfd..c6aaac7 100644 --- a/src/Tomighty/Core/UI/TYDefaultAppUI.m +++ b/src/Tomighty/Core/UI/TYDefaultAppUI.m @@ -83,4 +83,9 @@ - (void)updatePomodoroCount:(int)count [statusMenu enableResetPomodoroCountItem:count > 0]; } +- (void)handlePrerencesChange:(NSString*)which +{ + NSLog(@"Pref change: %@", which); +} + @end From 54decb2a764f16b253a87f4146cf2dcecc2ef8fb Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sat, 3 Sep 2016 21:48:48 +0400 Subject: [PATCH 15/32] Add carbonFlags property. --- src/Tomighty/Core/Hotkey/MVTHotkey.h | 1 + src/Tomighty/Core/Hotkey/MVTHotkey.m | 14 ++++++++++++++ src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m | 11 +++++++++++ 3 files changed, 26 insertions(+) diff --git a/src/Tomighty/Core/Hotkey/MVTHotkey.h b/src/Tomighty/Core/Hotkey/MVTHotkey.h index b2d5f30..046f387 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkey.h +++ b/src/Tomighty/Core/Hotkey/MVTHotkey.h @@ -32,6 +32,7 @@ @property (readonly) BOOL valid; @property (nonatomic, assign) SInt32 code; @property (nonatomic, assign) UInt32 flags; +@property (readonly) UInt32 carbonFlags; @property (nonatomic, strong) NSString *string; + (id)hotkeyWithCode:(CGKeyCode)code flags:(UInt32)flags; diff --git a/src/Tomighty/Core/Hotkey/MVTHotkey.m b/src/Tomighty/Core/Hotkey/MVTHotkey.m index aa703d3..b9920d3 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkey.m +++ b/src/Tomighty/Core/Hotkey/MVTHotkey.m @@ -92,6 +92,20 @@ - (NSString *)string return nil; } +- (UInt32)carbonFlags +{ + UInt32 cf = 0; + if(self.ctrl) + cf |= controlKey; + if(self.alt) + cf |= optionKey; + if(self.shift) + cf |= shiftKey; + if(self.cmd) + cf |= cmdKey; + return cf; +} + - (BOOL)ctrl { return _flags & NSControlKeyMask ? TRUE : FALSE; diff --git a/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m b/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m index 0609626..4822891 100644 --- a/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m +++ b/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m @@ -128,4 +128,15 @@ - (void)test_string_should_return_nil_if_invalid XCTAssertTrue(key.string == nil); } +- (void)test_sets_correct_carbon_flags { + key.string = @"⇧⌘S"; + XCTAssertTrue(key.carbonFlags & (shiftKey + cmdKey)); +} + +- (void)test_does_not_set_incorrect_carbon_flags +{ + key.string = @"⇧⌘S"; + XCTAssertFalse(key.carbonFlags & optionKey); +} + @end From 0ab55b391adfc3d6f0adacf4569d0c6334dcc6c3 Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sat, 3 Sep 2016 21:50:27 +0400 Subject: [PATCH 16/32] Remove prefrence change subscription. --- src/Tomighty/Core/Agent/TYUserInterfaceAgent.m | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m b/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m index d314371..06269eb 100644 --- a/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m +++ b/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m @@ -5,6 +5,7 @@ // http://www.apache.org/licenses/LICENSE-2.0.txt // +#import #import "TYUserInterfaceAgent.h" #import "TYTimerContext.h" @@ -56,11 +57,6 @@ - (void)updateAppUiInResponseToEventsFrom:(id )eventBus NSNumber *pomodoroCount = eventData; [ui updatePomodoroCount:[pomodoroCount intValue]]; }]; - - [eventBus subscribeTo:PREFERENCE_CHANGE subscriber:^(id eventData) { - NSString *pref = eventData; - [ui handlePrerencesChange:pref]; - }]; } @end From 1bf40bf75f75f0dcc467a6b3aaf07bea0c632fcc Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sat, 3 Sep 2016 21:52:10 +0400 Subject: [PATCH 17/32] Remove preference change handler. --- src/Tomighty/Core/UI/TYDefaultAppUI.m | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Tomighty/Core/UI/TYDefaultAppUI.m b/src/Tomighty/Core/UI/TYDefaultAppUI.m index c6aaac7..141dcfd 100644 --- a/src/Tomighty/Core/UI/TYDefaultAppUI.m +++ b/src/Tomighty/Core/UI/TYDefaultAppUI.m @@ -83,9 +83,4 @@ - (void)updatePomodoroCount:(int)count [statusMenu enableResetPomodoroCountItem:count > 0]; } -- (void)handlePrerencesChange:(NSString*)which -{ - NSLog(@"Pref change: %@", which); -} - @end From f0423c5d28009aac82c14bf94a0fd12466748c55 Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sat, 3 Sep 2016 21:52:38 +0400 Subject: [PATCH 18/32] Add global hotkey handlers. --- src/Tomighty/Core/TYDefaultTomighty.m | 71 +++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/Tomighty/Core/TYDefaultTomighty.m b/src/Tomighty/Core/TYDefaultTomighty.m index 36d4401..953f387 100644 --- a/src/Tomighty/Core/TYDefaultTomighty.m +++ b/src/Tomighty/Core/TYDefaultTomighty.m @@ -5,10 +5,12 @@ // http://www.apache.org/licenses/LICENSE-2.0.txt // +#import #import "TYDefaultTimerContext.h" #import "TYDefaultTomighty.h" #import "TYEventBus.h" #import "TYPreferences.h" +#import "MVTHotkey.h" @implementation TYDefaultTomighty { @@ -17,6 +19,7 @@ @implementation TYDefaultTomighty id timer; id preferences; id eventBus; + EventHotKeyRef startHotkeyRef, stopHotkeyRef; } - (id)initWith:(id )aTimer @@ -35,6 +38,13 @@ - (id)initWith:(id )aTimer { [self incrementPomodoroCount]; }]; + + [eventBus subscribeTo:PREFERENCE_CHANGE subscriber:^(id eventData) { + [self registerHotkeys]; + }]; + + [self installHotkeyEventHandler]; + [self registerHotkeys]; } return self; } @@ -100,4 +110,65 @@ - (void)incrementPomodoroCount [self setPomodoroCount:newCount]; } +// From here: http://stpeterandpaul.ca/tiger/documentation/Carbon/Reference/Carbon_Event_Manager_Ref/Reference/reference.html +- (void)installHotkeyEventHandler +{ + EventTypeSpec eventType; + eventType.eventClass=kEventClassKeyboard; + eventType.eventKind=kEventHotKeyPressed; + + InstallEventHandler(GetApplicationEventTarget(), &TYHotkeyHandler, + 1, &eventType, (__bridge void*)self, NULL); +} + +- (void)unregisterKeys +{ + if(startHotkeyRef) { + UnregisterEventHotKey(startHotkeyRef); + startHotkeyRef = nil; + } + if(stopHotkeyRef) { + UnregisterEventHotKey(stopHotkeyRef); + stopHotkeyRef = nil; + } +} + +- (void)registerHotkeys +{ + MVTHotkey *start = [MVTHotkey hotkeyWithString:[preferences + getString:PREF_HOTKEY_START]]; + MVTHotkey *stop = [MVTHotkey hotkeyWithString:[preferences + getString:PREF_HOTKEY_STOP]]; + EventHotKeyID hotkeyID; + + [self unregisterKeys]; + + hotkeyID.signature='thk1'; // it's a UInt32 actually, value can be anything + hotkeyID.id=11; + RegisterEventHotKey(start.code, start.carbonFlags, hotkeyID, + GetApplicationEventTarget(), 0, &startHotkeyRef); + + hotkeyID.signature='thk2'; + hotkeyID.id=13; + RegisterEventHotKey(stop.code, stop.carbonFlags, hotkeyID, + GetApplicationEventTarget(), 0, &stopHotkeyRef); + +} + +OSStatus TYHotkeyHandler(EventHandlerCallRef next, EventRef evt, void *data) { + TYDefaultTomighty *target = (__bridge TYDefaultTomighty*)data; + EventHotKeyID hkid; + GetEventParameter(evt, kEventParamDirectObject,typeEventHotKeyID, NULL, + sizeof(hkid), NULL, &hkid); + switch(hkid.id) { + case 11: + [target startPomodoro]; + break; + case 13: + [target stopTimer]; + break; + } + return noErr; +} + @end From 01b7805dfa6736e7da54a3dce6de9a7b5b48e2e2 Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sat, 3 Sep 2016 21:53:05 +0400 Subject: [PATCH 19/32] Add CarbonFramework. --- src/Tomighty.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Tomighty.xcodeproj/project.pbxproj b/src/Tomighty.xcodeproj/project.pbxproj index b2d4bda..f65211b 100644 --- a/src/Tomighty.xcodeproj/project.pbxproj +++ b/src/Tomighty.xcodeproj/project.pbxproj @@ -64,6 +64,7 @@ C69D84481D7971B900B24643 /* MVTHotkeyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D84471D7971B900B24643 /* MVTHotkeyTests.m */; }; C69D844D1D79722600B24643 /* MVTHotkeyCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D844A1D79722600B24643 /* MVTHotkeyCell.m */; }; C69D844E1D79722600B24643 /* MVTHotkeyControl.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D844C1D79722600B24643 /* MVTHotkeyControl.m */; }; + C69D84521D7B280800B24643 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C69D84511D7B280800B24643 /* Carbon.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -187,6 +188,7 @@ C69D844A1D79722600B24643 /* MVTHotkeyCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MVTHotkeyCell.m; path = Core/Hotkey/MVTHotkeyCell.m; sourceTree = ""; }; C69D844B1D79722600B24643 /* MVTHotkeyControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MVTHotkeyControl.h; path = Core/Hotkey/MVTHotkeyControl.h; sourceTree = ""; }; C69D844C1D79722600B24643 /* MVTHotkeyControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MVTHotkeyControl.m; path = Core/Hotkey/MVTHotkeyControl.m; sourceTree = ""; }; + C69D84511D7B280800B24643 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -194,6 +196,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + C69D84521D7B280800B24643 /* Carbon.framework in Frameworks */, 304AF81618BD04BE00A2EA74 /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -312,6 +315,7 @@ 304AF81418BD04BE00A2EA74 /* Frameworks */ = { isa = PBXGroup; children = ( + C69D84511D7B280800B24643 /* Carbon.framework */, 0B1A27968CA44FEFB1DA3DB3 /* libPods-TomightyTests.a */, 304AF81518BD04BE00A2EA74 /* Cocoa.framework */, 304AF83418BD04BE00A2EA74 /* XCTest.framework */, From 9630f9b1653188a4173dc633fd55840ae918ca4e Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sat, 3 Sep 2016 21:54:05 +0400 Subject: [PATCH 20/32] Remove preference change handler declaration. --- src/Tomighty/Core/UI/TYAppUI.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Tomighty/Core/UI/TYAppUI.h b/src/Tomighty/Core/UI/TYAppUI.h index 52ec6c2..f5bddec 100644 --- a/src/Tomighty/Core/UI/TYAppUI.h +++ b/src/Tomighty/Core/UI/TYAppUI.h @@ -15,6 +15,5 @@ - (void)switchToLongBreakState; - (void)updateRemainingTime:(int)remainingSeconds; - (void)updatePomodoroCount:(int)count; -- (void)handlePrerencesChange:(NSString*)which; @end From 53f382855ed8c0aa834a8a8dcb87848b65985749 Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Sun, 4 Sep 2016 11:54:26 +0400 Subject: [PATCH 21/32] Fix formatting and comments. --- src/Tomighty/Core/Hotkey/MVTHotkeyCell.m | 2 ++ src/Tomighty/Core/Hotkey/MVTHotkeyControl.h | 8 +------- src/Tomighty/Core/Hotkey/MVTHotkeyControl.m | 3 ++- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m b/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m index 41c159f..1e01e8f 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m +++ b/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m @@ -13,6 +13,7 @@ @implementation MVTHotkeyCell - (void)setHotkey:(MVTHotkey*)key { + // Respect IB text alignment settings NSMutableParagraphStyle *ps = [[NSMutableParagraphStyle alloc] init]; ps.alignment = self.alignment; NSMutableAttributedString *as; @@ -21,6 +22,7 @@ - (void)setHotkey:(MVTHotkey*)key inactiveColor:[NSColor controlHighlightColor]]; [as addAttribute:NSParagraphStyleAttributeName value:ps range:NSMakeRange(0, as.length)]; + [self setAttributedStringValue:as]; } diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyControl.h b/src/Tomighty/Core/Hotkey/MVTHotkeyControl.h index 581eeda..df25bca 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkeyControl.h +++ b/src/Tomighty/Core/Hotkey/MVTHotkeyControl.h @@ -8,17 +8,11 @@ #import "MVTHotkey.h" /** - @brief NSView subclass for capturing user clicked hotkeys + @brief NSControl subclass for capturing user clicked hotkeys @discussion When activated, this view listens to keyboard events and records the keystroke. Pressed keys are highlighted. - To use this class in IB select CustomView object from the library, plase - it in your window and assign MVTHotkeyView as a class to it. - - @remarks To be able capture Command (⌘) key controlling NSApplication's - sendAction must be overriden. - MVTHotkeyView ignores Tab, because it's used in navigation. */ diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m b/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m index 7c4beb7..10cd812 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m +++ b/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m @@ -64,7 +64,8 @@ - (MVTHotkey*)hotkey - (void)keyDown:(NSEvent *)theEvent { - MVTHotkey *key = [MVTHotkey hotkeyWithCode:[theEvent keyCode] flags:theEvent.modifierFlags]; + MVTHotkey *key = [MVTHotkey hotkeyWithCode:[theEvent keyCode] + flags:theEvent.modifierFlags]; if(key.valid) [self setHotkey:key]; else From 474058f7652a575d2fe4b529ca3dc870fc1046c0 Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Mon, 5 Sep 2016 08:33:04 +0400 Subject: [PATCH 22/32] Change class prefix from MVT to TY; Fix copyrights. --- src/Tomighty.xcodeproj/project.pbxproj | 46 +++++++++---------- src/Tomighty/Base.lproj/PreferencesWindow.xib | 10 ++-- src/Tomighty/Core/Hotkey/MVTHotkeyCell.h | 15 ------ src/Tomighty/Core/Hotkey/MVTHotkeyControl.h | 21 --------- .../Core/Hotkey/{MVTHotkey.h => TYHotkey.h} | 19 ++++---- .../Core/Hotkey/{MVTHotkey.m => TYHotkey.m} | 15 +++--- src/Tomighty/Core/Hotkey/TYHotkeyCell.h | 18 ++++++++ .../{MVTHotkeyCell.m => TYHotkeyCell.m} | 15 +++--- src/Tomighty/Core/Hotkey/TYHotkeyControl.h | 21 +++++++++ .../{MVTHotkeyControl.m => TYHotkeyControl.m} | 22 ++++----- src/Tomighty/Core/TYDefaultTomighty.m | 6 +-- .../Core/UI/TYPreferencesWindowController.h | 6 +-- .../Core/UI/TYPreferencesWindowController.m | 4 +- .../{MVTHotkeyTests.m => TYHotkeyTests.m} | 21 ++++----- 14 files changed, 120 insertions(+), 119 deletions(-) delete mode 100644 src/Tomighty/Core/Hotkey/MVTHotkeyCell.h delete mode 100644 src/Tomighty/Core/Hotkey/MVTHotkeyControl.h rename src/Tomighty/Core/Hotkey/{MVTHotkey.h => TYHotkey.h} (71%) rename src/Tomighty/Core/Hotkey/{MVTHotkey.m => TYHotkey.m} (96%) create mode 100644 src/Tomighty/Core/Hotkey/TYHotkeyCell.h rename src/Tomighty/Core/Hotkey/{MVTHotkeyCell.m => TYHotkeyCell.m} (66%) create mode 100644 src/Tomighty/Core/Hotkey/TYHotkeyControl.h rename src/Tomighty/Core/Hotkey/{MVTHotkeyControl.m => TYHotkeyControl.m} (71%) rename src/TomightyTests/Core/Hotkey/{MVTHotkeyTests.m => TYHotkeyTests.m} (89%) diff --git a/src/Tomighty.xcodeproj/project.pbxproj b/src/Tomighty.xcodeproj/project.pbxproj index f65211b..95a8939 100644 --- a/src/Tomighty.xcodeproj/project.pbxproj +++ b/src/Tomighty.xcodeproj/project.pbxproj @@ -60,10 +60,10 @@ 30DB72F618CD4FC800293915 /* TYTomightyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 30DB72F518CD4FC800293915 /* TYTomightyTests.m */; }; 30DB72FA18CD54D200293915 /* TYDefaultTomighty.m in Sources */ = {isa = PBXBuildFile; fileRef = 30DB72F918CD54D200293915 /* TYDefaultTomighty.m */; }; 88742E1C44894488BB0F167C /* libPods-TomightyTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B1A27968CA44FEFB1DA3DB3 /* libPods-TomightyTests.a */; }; - C69D84451D7971A000B24643 /* MVTHotkey.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D84441D7971A000B24643 /* MVTHotkey.m */; }; - C69D84481D7971B900B24643 /* MVTHotkeyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D84471D7971B900B24643 /* MVTHotkeyTests.m */; }; - C69D844D1D79722600B24643 /* MVTHotkeyCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D844A1D79722600B24643 /* MVTHotkeyCell.m */; }; - C69D844E1D79722600B24643 /* MVTHotkeyControl.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D844C1D79722600B24643 /* MVTHotkeyControl.m */; }; + C69D84451D7971A000B24643 /* TYHotkey.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D84441D7971A000B24643 /* TYHotkey.m */; }; + C69D84481D7971B900B24643 /* TYHotkeyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D84471D7971B900B24643 /* TYHotkeyTests.m */; }; + C69D844D1D79722600B24643 /* TYHotkeyCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D844A1D79722600B24643 /* TYHotkeyCell.m */; }; + C69D844E1D79722600B24643 /* TYHotkeyControl.m in Sources */ = {isa = PBXBuildFile; fileRef = C69D844C1D79722600B24643 /* TYHotkeyControl.m */; }; C69D84521D7B280800B24643 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C69D84511D7B280800B24643 /* Carbon.framework */; }; /* End PBXBuildFile section */ @@ -181,13 +181,13 @@ 30DB72F918CD54D200293915 /* TYDefaultTomighty.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYDefaultTomighty.m; path = Core/TYDefaultTomighty.m; sourceTree = ""; }; 4E46E0E26D22DDAFC599CB28 /* Pods-TomightyTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TomightyTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TomightyTests/Pods-TomightyTests.debug.xcconfig"; sourceTree = ""; }; 9C134136195EF68DBA17C261 /* Pods-TomightyTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TomightyTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-TomightyTests/Pods-TomightyTests.release.xcconfig"; sourceTree = ""; }; - C69D84431D7971A000B24643 /* MVTHotkey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MVTHotkey.h; path = Core/Hotkey/MVTHotkey.h; sourceTree = ""; }; - C69D84441D7971A000B24643 /* MVTHotkey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MVTHotkey.m; path = Core/Hotkey/MVTHotkey.m; sourceTree = ""; }; - C69D84471D7971B900B24643 /* MVTHotkeyTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MVTHotkeyTests.m; path = Core/Hotkey/MVTHotkeyTests.m; sourceTree = ""; }; - C69D84491D79722600B24643 /* MVTHotkeyCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MVTHotkeyCell.h; path = Core/Hotkey/MVTHotkeyCell.h; sourceTree = ""; }; - C69D844A1D79722600B24643 /* MVTHotkeyCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MVTHotkeyCell.m; path = Core/Hotkey/MVTHotkeyCell.m; sourceTree = ""; }; - C69D844B1D79722600B24643 /* MVTHotkeyControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MVTHotkeyControl.h; path = Core/Hotkey/MVTHotkeyControl.h; sourceTree = ""; }; - C69D844C1D79722600B24643 /* MVTHotkeyControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MVTHotkeyControl.m; path = Core/Hotkey/MVTHotkeyControl.m; sourceTree = ""; }; + C69D84431D7971A000B24643 /* TYHotkey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYHotkey.h; path = Core/Hotkey/TYHotkey.h; sourceTree = ""; }; + C69D84441D7971A000B24643 /* TYHotkey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYHotkey.m; path = Core/Hotkey/TYHotkey.m; sourceTree = ""; }; + C69D84471D7971B900B24643 /* TYHotkeyTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYHotkeyTests.m; path = Core/Hotkey/TYHotkeyTests.m; sourceTree = ""; }; + C69D84491D79722600B24643 /* TYHotkeyCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYHotkeyCell.h; path = Core/Hotkey/TYHotkeyCell.h; sourceTree = ""; }; + C69D844A1D79722600B24643 /* TYHotkeyCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYHotkeyCell.m; path = Core/Hotkey/TYHotkeyCell.m; sourceTree = ""; }; + C69D844B1D79722600B24643 /* TYHotkeyControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TYHotkeyControl.h; path = Core/Hotkey/TYHotkeyControl.h; sourceTree = ""; }; + C69D844C1D79722600B24643 /* TYHotkeyControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TYHotkeyControl.m; path = Core/Hotkey/TYHotkeyControl.m; sourceTree = ""; }; C69D84511D7B280800B24643 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ @@ -344,7 +344,6 @@ 300AE29018D1444400264309 /* PreferencesWindow.xib */, 304AF82D18BD04BE00A2EA74 /* Images.xcassets */, 304AF81C18BD04BE00A2EA74 /* Supporting Files */, - C69D84421D79718500B24643 /* Hotkey */, ); path = Tomighty; sourceTree = ""; @@ -383,6 +382,7 @@ 304AF84918BD117200A2EA74 /* Core */ = { isa = PBXGroup; children = ( + C69D84421D79718500B24643 /* Hotkey */, 3025AE5018D35AA000BC4207 /* Agent */, 3039D2F118C4DF47008689C9 /* Event */, 30415FAF18C51B4D0069FAE3 /* Preferences */, @@ -511,12 +511,12 @@ C69D84421D79718500B24643 /* Hotkey */ = { isa = PBXGroup; children = ( - C69D84431D7971A000B24643 /* MVTHotkey.h */, - C69D84441D7971A000B24643 /* MVTHotkey.m */, - C69D84491D79722600B24643 /* MVTHotkeyCell.h */, - C69D844A1D79722600B24643 /* MVTHotkeyCell.m */, - C69D844B1D79722600B24643 /* MVTHotkeyControl.h */, - C69D844C1D79722600B24643 /* MVTHotkeyControl.m */, + C69D84431D7971A000B24643 /* TYHotkey.h */, + C69D84441D7971A000B24643 /* TYHotkey.m */, + C69D84491D79722600B24643 /* TYHotkeyCell.h */, + C69D844A1D79722600B24643 /* TYHotkeyCell.m */, + C69D844B1D79722600B24643 /* TYHotkeyControl.h */, + C69D844C1D79722600B24643 /* TYHotkeyControl.m */, ); name = Hotkey; sourceTree = ""; @@ -524,7 +524,7 @@ C69D84461D7971AA00B24643 /* Hotkey */ = { isa = PBXGroup; children = ( - C69D84471D7971B900B24643 /* MVTHotkeyTests.m */, + C69D84471D7971B900B24643 /* TYHotkeyTests.m */, ); name = Hotkey; sourceTree = ""; @@ -698,14 +698,14 @@ 304AF82218BD04BE00A2EA74 /* main.m in Sources */, 30B89F9E18C3855600C1DD2B /* TYDefaultTimerContext.m in Sources */, 3025AE5518D35B2B00BC4207 /* TYSoundAgent.m in Sources */, - C69D84451D7971A000B24643 /* MVTHotkey.m in Sources */, + C69D84451D7971A000B24643 /* TYHotkey.m in Sources */, 309ECB0418C3828B00B270BF /* TYDefaultSystemTimer.m in Sources */, 3032EEE318C6AF2C00070BD2 /* TYDefaultSoundPlayer.m in Sources */, - C69D844E1D79722600B24643 /* MVTHotkeyControl.m in Sources */, + C69D844E1D79722600B24643 /* TYHotkeyControl.m in Sources */, 300AE29518D1471F00264309 /* TYPreferencesWindowController.m in Sources */, 30DB72FA18CD54D200293915 /* TYDefaultTomighty.m in Sources */, 301A007918BD417200B8DEE0 /* TYDefaultTimer.m in Sources */, - C69D844D1D79722600B24643 /* MVTHotkeyCell.m in Sources */, + C69D844D1D79722600B24643 /* TYHotkeyCell.m in Sources */, 309394E718D0C76100D6C71A /* TYDefaultStatusIcon.m in Sources */, 30C383E018CFE02100FABFFE /* TYDefaultAppUI.m in Sources */, 30415FB618C51C290069FAE3 /* TYUserDefaultsPreferences.m in Sources */, @@ -732,7 +732,7 @@ 30CFBF1218BD76F7000266B4 /* TYMockSystemTimer.m in Sources */, 30C383DC18CFDE8F00FABFFE /* TYAppUITests.m in Sources */, 3025AE5E18D35C0D00BC4207 /* TYUserInterfaceAgentTests.m in Sources */, - C69D84481D7971B900B24643 /* MVTHotkeyTests.m in Sources */, + C69D84481D7971B900B24643 /* TYHotkeyTests.m in Sources */, 30BD314318C556EE00428B1E /* TYMockEventBus.m in Sources */, 30415FAE18C5109D0069FAE3 /* TYPreferencesTests.m in Sources */, ); diff --git a/src/Tomighty/Base.lproj/PreferencesWindow.xib b/src/Tomighty/Base.lproj/PreferencesWindow.xib index ee3a274..7192c56 100644 --- a/src/Tomighty/Base.lproj/PreferencesWindow.xib +++ b/src/Tomighty/Base.lproj/PreferencesWindow.xib @@ -1,5 +1,5 @@ - + @@ -284,9 +284,9 @@ - + - + @@ -303,9 +303,9 @@ - + - + diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyCell.h b/src/Tomighty/Core/Hotkey/MVTHotkeyCell.h deleted file mode 100644 index ad4b4b4..0000000 --- a/src/Tomighty/Core/Hotkey/MVTHotkeyCell.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// MVTHotkeyCell.h -// MVTHotkeyViewApp -// -// Created by Misha Tavkhelidze on 8/28/16. -// Copyright © 2016 Misha Tavkhelidze. All rights reserved. -// - -#import "MVTHotkey.h" - -@interface MVTHotkeyCell : NSTextFieldCell - -- (void)setHotkey:(MVTHotkey*)key; - -@end diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyControl.h b/src/Tomighty/Core/Hotkey/MVTHotkeyControl.h deleted file mode 100644 index df25bca..0000000 --- a/src/Tomighty/Core/Hotkey/MVTHotkeyControl.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// MVTHotkeyView.h -// -// Created by Misha Tavkhelidze . -// Copyright © 2016 Misha Tavkhelidze. All rights reserved. -// - -#import "MVTHotkey.h" - -/** - @brief NSControl subclass for capturing user clicked hotkeys - - @discussion When activated, this view listens to keyboard events and records - the keystroke. Pressed keys are highlighted. - - MVTHotkeyView ignores Tab, because it's used in navigation. - -*/ -@interface MVTHotkeyControl : NSControl -@property (nonatomic, strong) MVTHotkey* hotkey; -@end diff --git a/src/Tomighty/Core/Hotkey/MVTHotkey.h b/src/Tomighty/Core/Hotkey/TYHotkey.h similarity index 71% rename from src/Tomighty/Core/Hotkey/MVTHotkey.h rename to src/Tomighty/Core/Hotkey/TYHotkey.h index 046f387..2247524 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkey.h +++ b/src/Tomighty/Core/Hotkey/TYHotkey.h @@ -1,29 +1,30 @@ // -// MVTHotkey.h -// Tomighty +// Tomighty - http://www.tomighty.org // -// Created by Misha Tavkhelidze on 8/27/16. -// Copyright © 2016 Gig Software. All rights reserved. +// This software is licensed under the Apache License Version 2.0: +// http://www.apache.org/licenses/LICENSE-2.0.txt // + +/// @credits #import @class NSColor; @class NSFont; -@class MVTHotkey; +@class TYHotkey; @protocol MVTHotkeyView -- (void)setHotkey:(MVTHotkey*)hotkey; +- (void)setHotkey:(TYHotkey*)hotkey; @optional -- (MVTHotkey*)hotkey; +- (TYHotkey*)hotkey; @end /** - @brief Helper object for MVTHotkeyView + @brief A helper class to handle and represent OS X hotkey. */ -@interface MVTHotkey : NSObject +@interface TYHotkey : NSObject @property (readonly) BOOL ctrl; @property (readonly) BOOL alt; diff --git a/src/Tomighty/Core/Hotkey/MVTHotkey.m b/src/Tomighty/Core/Hotkey/TYHotkey.m similarity index 96% rename from src/Tomighty/Core/Hotkey/MVTHotkey.m rename to src/Tomighty/Core/Hotkey/TYHotkey.m index b9920d3..8feea1b 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkey.m +++ b/src/Tomighty/Core/Hotkey/TYHotkey.m @@ -1,21 +1,20 @@ // -// MVTHotkey.m -// Tomighty +// Tomighty - http://www.tomighty.org // -// Created by Misha Tavkhelidze on 8/27/16. -// Copyright © 2016 Gig Software. All rights reserved. +// This software is licensed under the Apache License Version 2.0: +// http://www.apache.org/licenses/LICENSE-2.0.txt // #import #import -#import "MVTHotkey.h" +#import "TYHotkey.h" static NSString* const MVTControlKeyString = @"^"; static NSString* const MVTAlternativeKeyString = @"⌥"; static NSString* const MVTShiftKeyString = @"⇧"; static NSString* const MVTCommandKeyString = @"⌘"; -@implementation MVTHotkey { +@implementation TYHotkey { NSDictionary *_keymap; } @@ -23,7 +22,7 @@ @implementation MVTHotkey { + (id)hotkeyWithCode:(CGKeyCode)code flags:(UInt32)flags { - MVTHotkey *key = [[MVTHotkey alloc] init]; + TYHotkey *key = [[TYHotkey alloc] init]; if(key) { [key _withCodeAndFlags:code flags:flags]; } @@ -32,7 +31,7 @@ + (id)hotkeyWithCode:(CGKeyCode)code flags:(UInt32)flags + (id)hotkeyWithString:(NSString*)str { - MVTHotkey *key = [[MVTHotkey alloc] init]; + TYHotkey *key = [[TYHotkey alloc] init]; key.string = str; return key; } diff --git a/src/Tomighty/Core/Hotkey/TYHotkeyCell.h b/src/Tomighty/Core/Hotkey/TYHotkeyCell.h new file mode 100644 index 0000000..48ff9d1 --- /dev/null +++ b/src/Tomighty/Core/Hotkey/TYHotkeyCell.h @@ -0,0 +1,18 @@ +// +// Tomighty - http://www.tomighty.org +// +// This software is licensed under the Apache License Version 2.0: +// http://www.apache.org/licenses/LICENSE-2.0.txt +// + +#import "TYHotkey.h" +/** + @brief NSTextFieldCell subclass to draw hotkey string. + + @discussion TYHotkeyCell respects IB's text alignment settings. Nothing else yet. + */ +@interface TYHotkeyCell : NSTextFieldCell + +- (void)setHotkey:(TYHotkey*)key; + +@end diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m b/src/Tomighty/Core/Hotkey/TYHotkeyCell.m similarity index 66% rename from src/Tomighty/Core/Hotkey/MVTHotkeyCell.m rename to src/Tomighty/Core/Hotkey/TYHotkeyCell.m index 1e01e8f..0ebb93a 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkeyCell.m +++ b/src/Tomighty/Core/Hotkey/TYHotkeyCell.m @@ -1,17 +1,16 @@ // -// MVTHotkeyCell.m -// MVTHotkeyViewApp +// Tomighty - http://www.tomighty.org // -// Created by Misha Tavkhelidze on 8/28/16. -// Copyright © 2016 Misha Tavkhelidze. All rights reserved. +// This software is licensed under the Apache License Version 2.0: +// http://www.apache.org/licenses/LICENSE-2.0.txt // -#import "MVTHotkey.h" -#import "MVTHotkeyCell.h" +#import "TYHotkey.h" +#import "TYHotkeyCell.h" -@implementation MVTHotkeyCell +@implementation TYHotkeyCell -- (void)setHotkey:(MVTHotkey*)key +- (void)setHotkey:(TYHotkey*)key { // Respect IB text alignment settings NSMutableParagraphStyle *ps = [[NSMutableParagraphStyle alloc] init]; diff --git a/src/Tomighty/Core/Hotkey/TYHotkeyControl.h b/src/Tomighty/Core/Hotkey/TYHotkeyControl.h new file mode 100644 index 0000000..5399d8f --- /dev/null +++ b/src/Tomighty/Core/Hotkey/TYHotkeyControl.h @@ -0,0 +1,21 @@ +// +// Tomighty - http://www.tomighty.org +// +// This software is licensed under the Apache License Version 2.0: +// http://www.apache.org/licenses/LICENSE-2.0.txt +// + +#import "TYHotkey.h" + +/** + @brief NSControl subclass for capturing and displaying user clicked hotkeys. + + @discussion When activated, this view listens to keyboard events and records + the keystroke. Pressed keys are highlighted. + + MVTHotkeyView ignores Tab, because it's used in navigation. + +*/ +@interface TYHotkeyControl : NSControl +@property (nonatomic, strong) TYHotkey* hotkey; +@end diff --git a/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m b/src/Tomighty/Core/Hotkey/TYHotkeyControl.m similarity index 71% rename from src/Tomighty/Core/Hotkey/MVTHotkeyControl.m rename to src/Tomighty/Core/Hotkey/TYHotkeyControl.m index 10cd812..d74c16e 100644 --- a/src/Tomighty/Core/Hotkey/MVTHotkeyControl.m +++ b/src/Tomighty/Core/Hotkey/TYHotkeyControl.m @@ -1,20 +1,20 @@ // -// MVTHotkeyView.m +// Tomighty - http://www.tomighty.org // -// Created by Misha Tavkhelidze -// Copyright © 2016 Misha Tavkhelidze. All rights reserved. +// This software is licensed under the Apache License Version 2.0: +// http://www.apache.org/licenses/LICENSE-2.0.txt // #import -#import "MVTHotkeyControl.h" -#import "MVTHotkeyCell.h" -#import "MVTHotkey.h" +#import "TYHotkeyControl.h" +#import "TYHotkeyCell.h" +#import "TYHotkey.h" IB_DESIGNABLE -@implementation MVTHotkeyControl { +@implementation TYHotkeyControl { BOOL _key_valid; - MVTHotkey *_key; + TYHotkey *_key; } #pragma mark Initialization @@ -46,7 +46,7 @@ - (id)initWithCoder:(NSCoder *)coder { } #pragma mark Properties -- (void)setHotkey:(MVTHotkey*)hotkey +- (void)setHotkey:(TYHotkey*)hotkey { if(hotkey.valid) { _key = hotkey; @@ -55,7 +55,7 @@ - (void)setHotkey:(MVTHotkey*)hotkey } } -- (MVTHotkey*)hotkey +- (TYHotkey*)hotkey { return _key; } @@ -64,7 +64,7 @@ - (MVTHotkey*)hotkey - (void)keyDown:(NSEvent *)theEvent { - MVTHotkey *key = [MVTHotkey hotkeyWithCode:[theEvent keyCode] + TYHotkey *key = [TYHotkey hotkeyWithCode:[theEvent keyCode] flags:theEvent.modifierFlags]; if(key.valid) [self setHotkey:key]; diff --git a/src/Tomighty/Core/TYDefaultTomighty.m b/src/Tomighty/Core/TYDefaultTomighty.m index 953f387..ea46a48 100644 --- a/src/Tomighty/Core/TYDefaultTomighty.m +++ b/src/Tomighty/Core/TYDefaultTomighty.m @@ -10,7 +10,7 @@ #import "TYDefaultTomighty.h" #import "TYEventBus.h" #import "TYPreferences.h" -#import "MVTHotkey.h" +#import "TYHotkey.h" @implementation TYDefaultTomighty { @@ -135,9 +135,9 @@ - (void)unregisterKeys - (void)registerHotkeys { - MVTHotkey *start = [MVTHotkey hotkeyWithString:[preferences + TYHotkey *start = [TYHotkey hotkeyWithString:[preferences getString:PREF_HOTKEY_START]]; - MVTHotkey *stop = [MVTHotkey hotkeyWithString:[preferences + TYHotkey *stop = [TYHotkey hotkeyWithString:[preferences getString:PREF_HOTKEY_STOP]]; EventHotKeyID hotkeyID; diff --git a/src/Tomighty/Core/UI/TYPreferencesWindowController.h b/src/Tomighty/Core/UI/TYPreferencesWindowController.h index 243c061..02e075f 100644 --- a/src/Tomighty/Core/UI/TYPreferencesWindowController.h +++ b/src/Tomighty/Core/UI/TYPreferencesWindowController.h @@ -7,7 +7,7 @@ // #import -#import "MVTHotkeyControl.h" +#import "TYHotkeyControl.h" @interface TYPreferencesWindowController : NSWindowController @@ -20,8 +20,8 @@ @property (weak) IBOutlet NSButton *check_play_sound_when_timer_goes_off; @property (weak) IBOutlet NSButton *check_play_ticktock_sound_during_pomodoro; @property (weak) IBOutlet NSButton *check_play_ticktock_sound_during_break; -@property (weak) IBOutlet MVTHotkeyControl *text_hotkey_start; -@property (weak) IBOutlet MVTHotkeyControl *text_hotkey_stop; +@property (weak) IBOutlet TYHotkeyControl *text_hotkey_start; +@property (weak) IBOutlet TYHotkeyControl *text_hotkey_stop; - (IBAction)save_time_pomodoro:(id)sender; - (IBAction)save_time_short_break:(id)sender; diff --git a/src/Tomighty/Core/UI/TYPreferencesWindowController.m b/src/Tomighty/Core/UI/TYPreferencesWindowController.m index 81d40b3..d241af0 100644 --- a/src/Tomighty/Core/UI/TYPreferencesWindowController.m +++ b/src/Tomighty/Core/UI/TYPreferencesWindowController.m @@ -38,10 +38,10 @@ - (void)windowDidLoad [self.check_play_ticktock_sound_during_pomodoro setState:[preferences getInt:PREF_PLAY_TICKTOCK_SOUND_DURING_POMODORO]]; [self.check_play_ticktock_sound_during_break setState:[preferences getInt:PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK]]; [self.text_hotkey_start - setHotkey:[MVTHotkey hotkeyWithString:[preferences + setHotkey:[TYHotkey hotkeyWithString:[preferences getString:PREF_HOTKEY_START]]]; [self.text_hotkey_stop - setHotkey:[MVTHotkey hotkeyWithString:[preferences + setHotkey:[TYHotkey hotkeyWithString:[preferences getString:PREF_HOTKEY_STOP]]]; } diff --git a/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m b/src/TomightyTests/Core/Hotkey/TYHotkeyTests.m similarity index 89% rename from src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m rename to src/TomightyTests/Core/Hotkey/TYHotkeyTests.m index 4822891..2884a21 100644 --- a/src/TomightyTests/Core/Hotkey/MVTHotkeyTests.m +++ b/src/TomightyTests/Core/Hotkey/TYHotkeyTests.m @@ -1,27 +1,26 @@ // -// MVTHotkey.m -// Tomighty +// Tomighty - http://www.tomighty.org // -// Created by Misha Tavkhelidze on 8/27/16. -// Copyright © 2016 Gig Software. All rights reserved. +// This software is licensed under the Apache License Version 2.0: +// http://www.apache.org/licenses/LICENSE-2.0.txt // #import #import -#import "MVTHotkey.h" +#import "TYHotkey.h" -@interface MVTHotkeyTests : XCTestCase { - MVTHotkey *key; +@interface TYHotkeyTests : XCTestCase { + TYHotkey *key; } @end -@implementation MVTHotkeyTests +@implementation TYHotkeyTests - (void)setUp { [super setUp]; // ⇧⌘S - key = [MVTHotkey hotkeyWithCode:0x1 + key = [TYHotkey hotkeyWithCode:0x1 flags:(0 | NSCommandKeyMask | NSShiftKeyMask)]; } @@ -99,14 +98,14 @@ - (void)test_should_report_invalid_without_key_code { } - (void)test_should_report_invalid_if_tab { - key = [MVTHotkey hotkeyWithCode:kVK_Tab + key = [TYHotkey hotkeyWithCode:kVK_Tab flags:(0 | NSCommandKeyMask)]; XCTAssertFalse(key.valid); } - (void)test_should_report_invalid_if_no_modifier { - key = [MVTHotkey hotkeyWithCode:0x1 flags:0]; + key = [TYHotkey hotkeyWithCode:0x1 flags:0]; XCTAssertFalse(key.valid); } From c8f9ca90e5fae35e322143ac9e10711cb3c38e29 Mon Sep 17 00:00:00 2001 From: Misha Tavkhelidze Date: Mon, 5 Sep 2016 08:41:14 +0400 Subject: [PATCH 23/32] Fix TYHotkey so they don't mess with default user preferences. --- .../Core/Preferences/TYPreferencesTests.m | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/TomightyTests/Core/Preferences/TYPreferencesTests.m b/src/TomightyTests/Core/Preferences/TYPreferencesTests.m index 51de196..67dbc97 100644 --- a/src/TomightyTests/Core/Preferences/TYPreferencesTests.m +++ b/src/TomightyTests/Core/Preferences/TYPreferencesTests.m @@ -16,6 +16,9 @@ @interface TYPreferencesTests : XCTestCase @end +static NSString* const HOTKEY_START = @"^⌘P"; +static NSString* const HOTKEY_STOP = @"^⌘S"; + @implementation TYPreferencesTests { id preferences; @@ -73,19 +76,22 @@ - (void)test_set_and_get_integer_value - (void)test_set_and_get_string_value { - [preferences setString:PREF_HOTKEY_START value:@"^⌘P"]; - XCTAssertTrue([@"^⌘P" isEqualToString:[preferences + [preferences setString:PREF_HOTKEY_START value:@"deadbeef"]; + XCTAssertTrue([@"deadbeef" isEqualToString:[preferences getString:PREF_HOTKEY_START]]); + [preferences setString:PREF_HOTKEY_START value:HOTKEY_START]; } - (void)test_fire_event_when_string_value_changes_on_set { - [preferences setString:PREF_HOTKEY_STOP value:@"^⌘S"]; + [preferences setString:PREF_HOTKEY_STOP value:@""]; + [preferences setString:PREF_HOTKEY_STOP value:@"deadbeef"]; - XCTAssertEqual([eventBus getPublishedEventCount], (NSUInteger)1); + XCTAssertNotEqual([eventBus getPublishedEventCount], (NSUInteger)0); XCTAssertTrue([eventBus hasPublishedEvent:PREFERENCE_CHANGE withData:PREF_HOTKEY_STOP atPosition:1]); + [preferences setString:PREF_HOTKEY_STOP value:HOTKEY_STOP]; } - (void)test_fire_event_when_integer_value_changes_on_set From 84cb704434dece4e6d949c75d037b25543fe7036 Mon Sep 17 00:00:00 2001 From: Devon Tucker Date: Fri, 16 Sep 2016 16:26:09 -0700 Subject: [PATCH 24/32] Update the readme with more contributors. Changes to UI constraints/etc. --- README.md | 1 + src/Tomighty/Base.lproj/PreferencesWindow.xib | 157 ++++++++++-------- 2 files changed, 91 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index e9683b2..f5ca8c1 100644 --- a/README.md +++ b/README.md @@ -39,5 +39,6 @@ Thank you to all the contributors to Tomighty OSX: * Luke Wong (@hausofwong) * Matthew Andersen (@mattandersen) * Devon Tucker (@dvntucker) +* Misha Tavkhelidze (@mtavkhelidze) Please let us know if you feel your name is missing from this list (and feel free to update it with your PRs). diff --git a/src/Tomighty/Base.lproj/PreferencesWindow.xib b/src/Tomighty/Base.lproj/PreferencesWindow.xib index e48b3a7..011be80 100644 --- a/src/Tomighty/Base.lproj/PreferencesWindow.xib +++ b/src/Tomighty/Base.lproj/PreferencesWindow.xib @@ -1,5 +1,5 @@ - + @@ -25,23 +25,23 @@ - + - + - + - + - + @@ -49,7 +49,7 @@ - + @@ -76,11 +76,14 @@ - + - + + + + @@ -88,7 +91,7 @@ - + @@ -96,7 +99,7 @@ - + @@ -104,7 +107,7 @@ - + @@ -119,7 +122,7 @@ - + @@ -134,7 +137,7 @@ - + @@ -145,7 +148,7 @@ - + @@ -153,7 +156,7 @@ - + @@ -161,7 +164,7 @@ - + @@ -194,27 +197,32 @@ + - + - + - + - + + + + @@ -242,7 +256,7 @@ - + @@ -260,7 +274,7 @@ - - - + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - + - - - - - - - - - - + + - - + + @@ -335,16 +335,16 @@ - - + + - - + + @@ -354,22 +354,45 @@ + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + From 529454a6521d0708838d0c1c34e4bcd8659b4cd6 Mon Sep 17 00:00:00 2001 From: Devon Tucker Date: Tue, 20 Sep 2016 21:59:20 -0700 Subject: [PATCH 25/32] Add a continuous mode to automatically start next timer (#33) * Added a continuous mode to keep timers running without intervention * Added continuous mode pref UI. Slight UI adjustments to accomodate. --- src/Tomighty/Base.lproj/PreferencesWindow.xib | 20 +++++++++++---- src/Tomighty/Core/Event/TYEventBus.h | 3 ++- src/Tomighty/Core/Preferences/TYPreferences.h | 1 + .../Preferences/TYUserDefaultsPreferences.m | 6 +++-- src/Tomighty/Core/TYDefaultTomighty.m | 25 +++++++++++++++++++ src/Tomighty/Core/Timer/TYDefaultTimer.m | 4 +++ .../Core/UI/TYPreferencesWindowController.h | 1 + .../Core/UI/TYPreferencesWindowController.m | 5 ++++ 8 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/Tomighty/Base.lproj/PreferencesWindow.xib b/src/Tomighty/Base.lproj/PreferencesWindow.xib index 011be80..2c05707 100644 --- a/src/Tomighty/Base.lproj/PreferencesWindow.xib +++ b/src/Tomighty/Base.lproj/PreferencesWindow.xib @@ -1,13 +1,14 @@ - + - + + @@ -26,7 +27,7 @@ - + @@ -181,6 +182,17 @@ + @@ -292,8 +304,6 @@ - - diff --git a/src/Tomighty/Core/Event/TYEventBus.h b/src/Tomighty/Core/Event/TYEventBus.h index 127dc0d..a7c2b6b 100644 --- a/src/Tomighty/Core/Event/TYEventBus.h +++ b/src/Tomighty/Core/Event/TYEventBus.h @@ -25,7 +25,8 @@ typedef NS_ENUM(NSInteger, TYEventType) POMODORO_COMPLETE = 10, POMODORO_COUNT_CHANGE = 11, - PREFERENCE_CHANGE = 12 + PREFERENCE_CHANGE = 12, + READY_FOR_NEXT_TIMER = 13 }; typedef void (^TYEventSubscriber)(id eventData); diff --git a/src/Tomighty/Core/Preferences/TYPreferences.h b/src/Tomighty/Core/Preferences/TYPreferences.h index a9b1322..34ad0c0 100644 --- a/src/Tomighty/Core/Preferences/TYPreferences.h +++ b/src/Tomighty/Core/Preferences/TYPreferences.h @@ -20,6 +20,7 @@ extern int const PREF_STATUS_ICON_TIME_FORMAT_MINUTES; extern int const PREF_STATUS_ICON_TIME_FORMAT_SECONDS; extern NSString * const PREF_HOTKEY_START; extern NSString * const PREF_HOTKEY_STOP; +extern NSString * const PREF_CONTINUOUS_MODE; @protocol TYPreferences diff --git a/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m b/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m index 3379b85..6ce79df 100644 --- a/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m +++ b/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m @@ -15,6 +15,7 @@ NSString * const PREF_PLAY_SOUND_WHEN_TIMER_GOES_OFF = @"org.tomighty.sound.play_on_timer_stop"; NSString * const PREF_PLAY_TICKTOCK_SOUND_DURING_POMODORO = @"org.tomighty.sound.play_tick_tock_during_pomodoro"; NSString * const PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK = @"org.tomighty.sound.play_tick_tock_during_break"; +NSString * const PREF_CONTINUOUS_MODE = @"org.tomighty.continuous"; NSString * const PREF_STATUS_ICON_TIME_FORMAT = @"org.tomighty.general.status_icon_time_format"; // formats must have same values as TYAppUIStatusIconTextFormat enum in TYAppUI.h // TODO : move this values to some common place? @@ -35,9 +36,9 @@ - (id)initWith:(id )anEventBus if(self) { eventBus = anEventBus; - + NSMutableDictionary *defaultValues = [NSMutableDictionary dictionary]; - + [defaultValues setObject:[NSNumber numberWithInt:25] forKey:PREF_TIME_POMODORO]; [defaultValues setObject:[NSNumber numberWithInt:5] forKey:PREF_TIME_SHORT_BREAK]; [defaultValues setObject:[NSNumber numberWithInt:15] forKey:PREF_TIME_LONG_BREAK]; @@ -45,6 +46,7 @@ - (id)initWith:(id )anEventBus [defaultValues setObject:[NSNumber numberWithInt:true] forKey:PREF_PLAY_SOUND_WHEN_TIMER_GOES_OFF]; [defaultValues setObject:[NSNumber numberWithInt:true] forKey:PREF_PLAY_TICKTOCK_SOUND_DURING_POMODORO]; [defaultValues setObject:[NSNumber numberWithInt:true] forKey:PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK]; + [defaultValues setObject:[NSNumber numberWithInt:true] forKey:PREF_CONTINUOUS_MODE]; [defaultValues setObject:[NSNumber numberWithInt:PREF_STATUS_ICON_TIME_FORMAT_NONE] forKey:PREF_STATUS_ICON_TIME_FORMAT]; [defaultValues setObject:@"^⌘P" forKey:PREF_HOTKEY_START]; [defaultValues setObject:@"^⌘S" forKey:PREF_HOTKEY_STOP]; diff --git a/src/Tomighty/Core/TYDefaultTomighty.m b/src/Tomighty/Core/TYDefaultTomighty.m index ea46a48..b8d9170 100644 --- a/src/Tomighty/Core/TYDefaultTomighty.m +++ b/src/Tomighty/Core/TYDefaultTomighty.m @@ -19,6 +19,7 @@ @implementation TYDefaultTomighty id timer; id preferences; id eventBus; + BOOL continuousMode; EventHotKeyRef startHotkeyRef, stopHotkeyRef; } @@ -33,10 +34,34 @@ - (id)initWith:(id )aTimer timer = aTimer; preferences = aPreferences; eventBus = anEventBus; + continuousMode = [preferences getInt:PREF_CONTINUOUS_MODE]; [eventBus subscribeTo:POMODORO_COMPLETE subscriber:^(id eventData) { [self incrementPomodoroCount]; + + }]; + + [eventBus subscribeTo:READY_FOR_NEXT_TIMER subscriber:^(id eventData) { + if ([preferences getInt:PREF_CONTINUOUS_MODE] == YES) { + //start the next timer, depending on the previous context + id context = eventData; + switch ([context getContextType]) { + case POMODORO: + if (pomodoroCount < 4) { + [self startShortBreak]; + } + else { + [self startLongBreak]; + } + break; + + default: + [self startPomodoro]; + break; + } + } + }]; [eventBus subscribeTo:PREFERENCE_CHANGE subscriber:^(id eventData) { diff --git a/src/Tomighty/Core/Timer/TYDefaultTimer.m b/src/Tomighty/Core/Timer/TYDefaultTimer.m index 5e03d3a..f431275 100644 --- a/src/Tomighty/Core/Timer/TYDefaultTimer.m +++ b/src/Tomighty/Core/Timer/TYDefaultTimer.m @@ -57,6 +57,10 @@ - (void)stop { [systemTimer interrupt]; [eventBus publish:TIMER_STOP data:currentTimerContext]; + if([currentTimerContext getRemainingSeconds] <= 0) + { + [eventBus publish:READY_FOR_NEXT_TIMER data:currentTimerContext]; + } } @end diff --git a/src/Tomighty/Core/UI/TYPreferencesWindowController.h b/src/Tomighty/Core/UI/TYPreferencesWindowController.h index 22ff303..8a0c209 100644 --- a/src/Tomighty/Core/UI/TYPreferencesWindowController.h +++ b/src/Tomighty/Core/UI/TYPreferencesWindowController.h @@ -20,6 +20,7 @@ @property (weak) IBOutlet NSButton *check_play_sound_when_timer_goes_off; @property (weak) IBOutlet NSButton *check_play_ticktock_sound_during_pomodoro; @property (weak) IBOutlet NSButton *check_play_ticktock_sound_during_break; +@property (weak) IBOutlet NSButton *check_continuous_mode; @property (weak) IBOutlet NSPopUpButton *popup_status_icon_time_format; @property (weak) IBOutlet TYHotkeyControl *text_hotkey_start; @property (weak) IBOutlet TYHotkeyControl *text_hotkey_stop; diff --git a/src/Tomighty/Core/UI/TYPreferencesWindowController.m b/src/Tomighty/Core/UI/TYPreferencesWindowController.m index e97d9e0..58630c6 100644 --- a/src/Tomighty/Core/UI/TYPreferencesWindowController.m +++ b/src/Tomighty/Core/UI/TYPreferencesWindowController.m @@ -37,6 +37,7 @@ - (void)windowDidLoad [self.check_play_sound_when_timer_goes_off setState:[preferences getInt:PREF_PLAY_SOUND_WHEN_TIMER_GOES_OFF]]; [self.check_play_ticktock_sound_during_pomodoro setState:[preferences getInt:PREF_PLAY_TICKTOCK_SOUND_DURING_POMODORO]]; [self.check_play_ticktock_sound_during_break setState:[preferences getInt:PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK]]; + [self.check_continuous_mode setState:[preferences getInt:PREF_CONTINUOUS_MODE]]; [self.popup_status_icon_time_format selectItemAtIndex:[preferences getInt:PREF_STATUS_ICON_TIME_FORMAT]]; [self.text_hotkey_start setHotkey:[TYHotkey hotkeyWithString:[preferences @@ -79,6 +80,10 @@ - (IBAction)save_play_ticktock_sound_during_break:(id)sender { [preferences setInt:PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK value:(int)[self.check_play_ticktock_sound_during_break state]]; } +- (IBAction)save_continuous_mode:(id)sender { + [preferences setInt:PREF_CONTINUOUS_MODE value:(int)[self.check_continuous_mode state]]; +} + - (IBAction)save_status_icon_time_format:(id)sender { [preferences setInt:PREF_STATUS_ICON_TIME_FORMAT value:(int)self.popup_status_icon_time_format.indexOfSelectedItem]; } From 9fff0d92908c848903210ddd4f9bba50cd1db4a5 Mon Sep 17 00:00:00 2001 From: Robert Keresnyei Date: Thu, 22 Sep 2016 11:51:01 +0200 Subject: [PATCH 26/32] Ticking bug fix --- src/Tomighty/Core/Agent/TYSoundAgent.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Tomighty/Core/Agent/TYSoundAgent.m b/src/Tomighty/Core/Agent/TYSoundAgent.m index 7420ae6..ca62cdb 100644 --- a/src/Tomighty/Core/Agent/TYSoundAgent.m +++ b/src/Tomighty/Core/Agent/TYSoundAgent.m @@ -41,6 +41,7 @@ - (void)playSoundsInResponseToEventsFrom:(id )eventBus [eventBus subscribeTo:POMODORO_START subscriber:^(id timerContext) { + [soundPlayer stopCurrentLoop]; if([preferences getInt:PREF_PLAY_TICKTOCK_SOUND_DURING_POMODORO]) { [soundPlayer loop:SOUND_TIMER_TICK]; @@ -49,6 +50,7 @@ - (void)playSoundsInResponseToEventsFrom:(id )eventBus [eventBus subscribeTo:BREAK_START subscriber:^(id timerContext) { + [soundPlayer stopCurrentLoop]; if([preferences getInt:PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK]) { [soundPlayer loop:SOUND_TIMER_TICK]; From ed0a5c4b87c2223fd8e762a135c1ab75a557cf33 Mon Sep 17 00:00:00 2001 From: Devon Tucker Date: Fri, 23 Sep 2016 15:29:41 -0700 Subject: [PATCH 27/32] Changed stop and clock icons to templates --- src/Tomighty/TYAppDelegate.m | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Tomighty/TYAppDelegate.m b/src/Tomighty/TYAppDelegate.m index e2c0e14..782330a 100644 --- a/src/Tomighty/TYAppDelegate.m +++ b/src/Tomighty/TYAppDelegate.m @@ -71,8 +71,12 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification } - (void)initMenuItemsIcons:(TYImageLoader *)imageLoader { - [self.remainingTimeMenuItem setImage:[imageLoader loadIcon:@"icon-clock"]]; - [self.stopTimerMenuItem setImage:[imageLoader loadIcon:@"icon-stop-timer"]]; + NSImage *clockIcon = [imageLoader loadIcon:@"icon-clock"]; + [clockIcon setTemplate:TRUE]; + [self.remainingTimeMenuItem setImage:clockIcon]; + NSImage *stopIcon = [imageLoader loadIcon:@"icon-stop-timer"]; + [stopIcon setTemplate:TRUE]; + [self.stopTimerMenuItem setImage:stopIcon]; [self.startPomodoroMenuItem setImage:[imageLoader loadIcon:@"icon-start-pomodoro"]]; [self.startShortBreakMenuItem setImage:[imageLoader loadIcon:@"icon-start-short-break"]]; [self.startLongBreakMenuItem setImage:[imageLoader loadIcon:@"icon-start-long-break"]]; From 52890b2573003f6d1bafa86378f20402337b3074 Mon Sep 17 00:00:00 2001 From: Devon Tucker Date: Thu, 3 Mar 2016 19:11:14 -0800 Subject: [PATCH 28/32] Added notifications --- src/Tomighty/Core/Agent/TYUserInterfaceAgent.m | 12 ++++++++++++ src/Tomighty/TYAppDelegate.h | 2 +- src/Tomighty/TYAppDelegate.m | 6 ++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m b/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m index 480ead2..674cc71 100644 --- a/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m +++ b/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m @@ -26,6 +26,15 @@ - (id)initWith:(id )theAppUI preferences:(id )aPreferenc return self; } +- (void)dispatchNewNotification: (NSString*) text +{ + NSUserNotification *notification = [[NSUserNotification alloc] init]; + notification.title = text; + notification.soundName = NSUserNotificationDefaultSoundName; + + [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification]; +} + - (void)updateAppUiInResponseToEventsFrom:(id )eventBus { [eventBus subscribeTo:APP_INIT subscriber:^(id eventData) { @@ -37,6 +46,7 @@ - (void)updateAppUiInResponseToEventsFrom:(id )eventBus [eventBus subscribeTo:POMODORO_START subscriber:^(id eventData) { [ui switchToPomodoroState]; + [self dispatchNewNotification:@"Pomodoro started"]; }]; [eventBus subscribeTo:TIMER_STOP subscriber:^(id eventData) { @@ -45,10 +55,12 @@ - (void)updateAppUiInResponseToEventsFrom:(id )eventBus [eventBus subscribeTo:SHORT_BREAK_START subscriber:^(id eventData) { [ui switchToShortBreakState]; + [self dispatchNewNotification:@"Short break started"]; }]; [eventBus subscribeTo:LONG_BREAK_START subscriber:^(id eventData) { [ui switchToLongBreakState]; + [self dispatchNewNotification:@"Long break started"]; }]; [eventBus subscribeTo:TIMER_TICK subscriber:^(id timerContext) { diff --git a/src/Tomighty/TYAppDelegate.h b/src/Tomighty/TYAppDelegate.h index d2d813f..c9d5e1f 100644 --- a/src/Tomighty/TYAppDelegate.h +++ b/src/Tomighty/TYAppDelegate.h @@ -10,7 +10,7 @@ #import "TYStatusMenu.h" #import "TYStatusIcon.h" -@interface TYAppDelegate : NSObject +@interface TYAppDelegate : NSObject @property (weak) IBOutlet NSMenu *statusMenu; @property (weak) IBOutlet NSMenuItem *remainingTimeMenuItem; diff --git a/src/Tomighty/TYAppDelegate.m b/src/Tomighty/TYAppDelegate.m index 782330a..5a77f91 100644 --- a/src/Tomighty/TYAppDelegate.m +++ b/src/Tomighty/TYAppDelegate.m @@ -64,6 +64,7 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification [syntheticEventPublisher publishSyntheticEventsInResponseToOtherEventsFrom:eventBus]; [soundAgent playSoundsInResponseToEventsFrom:eventBus]; [userInterfaceAgent updateAppUiInResponseToEventsFrom:eventBus]; + [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self]; [self initMenuItemsIcons:imageLoader]; @@ -158,4 +159,9 @@ - (void)setPomodoroCountText:(NSString *)text [self.pomodoroCountMenuItem setTitle:text]; } +- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center shouldPresentNotification:(NSUserNotification *)notification +{ + return YES; +} + @end From ce24493d72146abd6aa7c21ae939fc88561c1036 Mon Sep 17 00:00:00 2001 From: Devon Tucker Date: Mon, 24 Oct 2016 13:36:58 -0700 Subject: [PATCH 29/32] Added notifications when timers go off + preferences to enable/disable them --- src/Tomighty/Base.lproj/PreferencesWindow.xib | 30 +++++++++++++------ .../Core/Agent/TYUserInterfaceAgent.m | 12 ++++---- src/Tomighty/Core/Preferences/TYPreferences.h | 1 + .../Preferences/TYUserDefaultsPreferences.m | 2 ++ .../Core/UI/TYPreferencesWindowController.h | 3 ++ .../Core/UI/TYPreferencesWindowController.m | 5 ++++ 6 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/Tomighty/Base.lproj/PreferencesWindow.xib b/src/Tomighty/Base.lproj/PreferencesWindow.xib index 2c05707..ef8ce71 100644 --- a/src/Tomighty/Base.lproj/PreferencesWindow.xib +++ b/src/Tomighty/Base.lproj/PreferencesWindow.xib @@ -1,5 +1,5 @@ - - + + @@ -13,6 +13,7 @@ + @@ -27,7 +28,7 @@ - + @@ -257,7 +258,7 @@ - + @@ -268,7 +269,7 @@ - + @@ -305,14 +306,25 @@ + - + - - - + + + diff --git a/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m b/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m index 674cc71..fe2b6f3 100644 --- a/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m +++ b/src/Tomighty/Core/Agent/TYUserInterfaceAgent.m @@ -28,11 +28,13 @@ - (id)initWith:(id )theAppUI preferences:(id )aPreferenc - (void)dispatchNewNotification: (NSString*) text { - NSUserNotification *notification = [[NSUserNotification alloc] init]; - notification.title = text; - notification.soundName = NSUserNotificationDefaultSoundName; - - [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification]; + if ([preferences getInt:PREF_ENABLE_NOTIFICATIONS]) { + NSUserNotification *notification = [[NSUserNotification alloc] init]; + notification.title = text; + notification.soundName = NSUserNotificationDefaultSoundName; + + [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification]; + } } - (void)updateAppUiInResponseToEventsFrom:(id )eventBus diff --git a/src/Tomighty/Core/Preferences/TYPreferences.h b/src/Tomighty/Core/Preferences/TYPreferences.h index 34ad0c0..64c0a1e 100644 --- a/src/Tomighty/Core/Preferences/TYPreferences.h +++ b/src/Tomighty/Core/Preferences/TYPreferences.h @@ -21,6 +21,7 @@ extern int const PREF_STATUS_ICON_TIME_FORMAT_SECONDS; extern NSString * const PREF_HOTKEY_START; extern NSString * const PREF_HOTKEY_STOP; extern NSString * const PREF_CONTINUOUS_MODE; +extern NSString * const PREF_ENABLE_NOTIFICATIONS; @protocol TYPreferences diff --git a/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m b/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m index 6ce79df..ebd40cb 100644 --- a/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m +++ b/src/Tomighty/Core/Preferences/TYUserDefaultsPreferences.m @@ -24,6 +24,7 @@ int const PREF_STATUS_ICON_TIME_FORMAT_SECONDS = 2; NSString * const PREF_HOTKEY_START = @"org.tomighty.hotkey.start"; NSString * const PREF_HOTKEY_STOP = @"org.tomighty.hotkey.stop"; +NSString * const PREF_ENABLE_NOTIFICATIONS = @"org.tomighty.enable_notifications"; @implementation TYUserDefaultsPreferences { @@ -47,6 +48,7 @@ - (id)initWith:(id )anEventBus [defaultValues setObject:[NSNumber numberWithInt:true] forKey:PREF_PLAY_TICKTOCK_SOUND_DURING_POMODORO]; [defaultValues setObject:[NSNumber numberWithInt:true] forKey:PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK]; [defaultValues setObject:[NSNumber numberWithInt:true] forKey:PREF_CONTINUOUS_MODE]; + [defaultValues setObject:[NSNumber numberWithInt:false] forKey:PREF_ENABLE_NOTIFICATIONS]; [defaultValues setObject:[NSNumber numberWithInt:PREF_STATUS_ICON_TIME_FORMAT_NONE] forKey:PREF_STATUS_ICON_TIME_FORMAT]; [defaultValues setObject:@"^⌘P" forKey:PREF_HOTKEY_START]; [defaultValues setObject:@"^⌘S" forKey:PREF_HOTKEY_STOP]; diff --git a/src/Tomighty/Core/UI/TYPreferencesWindowController.h b/src/Tomighty/Core/UI/TYPreferencesWindowController.h index 8a0c209..a95bf2a 100644 --- a/src/Tomighty/Core/UI/TYPreferencesWindowController.h +++ b/src/Tomighty/Core/UI/TYPreferencesWindowController.h @@ -20,11 +20,13 @@ @property (weak) IBOutlet NSButton *check_play_sound_when_timer_goes_off; @property (weak) IBOutlet NSButton *check_play_ticktock_sound_during_pomodoro; @property (weak) IBOutlet NSButton *check_play_ticktock_sound_during_break; +@property (weak) IBOutlet NSButton *check_show_notifications; @property (weak) IBOutlet NSButton *check_continuous_mode; @property (weak) IBOutlet NSPopUpButton *popup_status_icon_time_format; @property (weak) IBOutlet TYHotkeyControl *text_hotkey_start; @property (weak) IBOutlet TYHotkeyControl *text_hotkey_stop; + - (IBAction)save_time_pomodoro:(id)sender; - (IBAction)save_time_short_break:(id)sender; - (IBAction)save_time_long_break:(id)sender; @@ -35,5 +37,6 @@ - (IBAction)save_status_icon_time_format:(id)sender; - (IBAction)save_hotkey_start:(id)sender; - (IBAction)save_hotkey_stop:(id)sender; +- (IBAction)save_show_notifications:(id)sender; @end diff --git a/src/Tomighty/Core/UI/TYPreferencesWindowController.m b/src/Tomighty/Core/UI/TYPreferencesWindowController.m index 58630c6..c5af10b 100644 --- a/src/Tomighty/Core/UI/TYPreferencesWindowController.m +++ b/src/Tomighty/Core/UI/TYPreferencesWindowController.m @@ -37,6 +37,7 @@ - (void)windowDidLoad [self.check_play_sound_when_timer_goes_off setState:[preferences getInt:PREF_PLAY_SOUND_WHEN_TIMER_GOES_OFF]]; [self.check_play_ticktock_sound_during_pomodoro setState:[preferences getInt:PREF_PLAY_TICKTOCK_SOUND_DURING_POMODORO]]; [self.check_play_ticktock_sound_during_break setState:[preferences getInt:PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK]]; + [self.check_show_notifications setState:[preferences getInt:PREF_ENABLE_NOTIFICATIONS]]; [self.check_continuous_mode setState:[preferences getInt:PREF_CONTINUOUS_MODE]]; [self.popup_status_icon_time_format selectItemAtIndex:[preferences getInt:PREF_STATUS_ICON_TIME_FORMAT]]; [self.text_hotkey_start @@ -80,6 +81,10 @@ - (IBAction)save_play_ticktock_sound_during_break:(id)sender { [preferences setInt:PREF_PLAY_TICKTOCK_SOUND_DURING_BREAK value:(int)[self.check_play_ticktock_sound_during_break state]]; } +- (IBAction)save_show_notifications:(id)sender { + [preferences setInt:PREF_ENABLE_NOTIFICATIONS value:(int)[self.check_show_notifications state]]; +} + - (IBAction)save_continuous_mode:(id)sender { [preferences setInt:PREF_CONTINUOUS_MODE value:(int)[self.check_continuous_mode state]]; } From 1f3f74037d2a382c5640cfad499ab02d2793e20f Mon Sep 17 00:00:00 2001 From: Roberto Luis Bisbe Date: Fri, 25 Nov 2016 19:15:06 +0100 Subject: [PATCH 30/32] Added remaining seconds for last minute --- src/Tomighty/Core/UI/TYDefaultAppUI.m | 6 +++++- src/TomightyTests/Core/UI/TYAppUITests.m | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Tomighty/Core/UI/TYDefaultAppUI.m b/src/Tomighty/Core/UI/TYDefaultAppUI.m index 00fcae9..aaa5afa 100644 --- a/src/Tomighty/Core/UI/TYDefaultAppUI.m +++ b/src/Tomighty/Core/UI/TYDefaultAppUI.m @@ -85,7 +85,11 @@ - (void)updateRemainingTime:(int)remainingSeconds withMode:(TYAppUIRemainingTime [statusIcon setStatusText:@" Stopped"]; } else { if (timeFormat == TYAppUIStatusIconTextFormatMinutes) { - text = [NSString stringWithFormat:@" %d m", minutes + (mode == TYAppUIRemainingTimeModeStart ? 0:1)]; + if(minutes < 1){ + text = [NSString stringWithFormat:@" %02d s", seconds]; + } else { + text = [NSString stringWithFormat:@" %d m", minutes + (mode == TYAppUIRemainingTimeModeStart ? 0:1)]; + } } else if (timeFormat == TYAppUIStatusIconTextFormatSeconds) { text = [NSString stringWithFormat:@" %02d:%02d", minutes, seconds]; } diff --git a/src/TomightyTests/Core/UI/TYAppUITests.m b/src/TomightyTests/Core/UI/TYAppUITests.m index 0ba55ac..8a34fb9 100644 --- a/src/TomightyTests/Core/UI/TYAppUITests.m +++ b/src/TomightyTests/Core/UI/TYAppUITests.m @@ -147,6 +147,14 @@ - (void)test_update_remaining_time_with_start_mode } +- (void)test_update_remaining_time_to_fifty_nine_seconds_with_format_minutes +{ + [appUi setStatusIconTextFormat:TYAppUIStatusIconTextFormatMinutes]; + + [appUi updateRemainingTime:59 withMode:TYAppUIRemainingTimeModeDefault]; + [verify(statusIcon) setStatusText:@" 59 s"]; +} + - (void)test_update_pomodoro_count_to_zero { [appUi updatePomodoroCount:0]; From ed6971cf7bdba55baa62e48c6556023f387d9d16 Mon Sep 17 00:00:00 2001 From: Devon Tucker Date: Fri, 16 Dec 2016 10:13:31 -0800 Subject: [PATCH 31/32] Update version number to 1.2. Fix build readme typo. --- build/README.md | 2 +- src/Tomighty/Tomighty-Info.plist | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/README.md b/build/README.md index 6669d6e..f8754fd 100644 --- a/build/README.md +++ b/build/README.md @@ -5,7 +5,7 @@ from the command line. ## Running -Simply run build.sh from the build directory. Build artifacts should appear in the `targer` +Simply run build.sh from the build directory. Build artifacts should appear in the `target` directory. Existing build artifacts must be deleted before running again. ## Packaging diff --git a/src/Tomighty/Tomighty-Info.plist b/src/Tomighty/Tomighty-Info.plist index 1ecf76e..5562496 100644 --- a/src/Tomighty/Tomighty-Info.plist +++ b/src/Tomighty/Tomighty-Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.1 + 1.2 CFBundleSignature ???? CFBundleVersion From efd9b58ce1a2c51bea34219cc57daef6554c84cd Mon Sep 17 00:00:00 2001 From: Devon Tucker Date: Fri, 16 Dec 2016 10:24:35 -0800 Subject: [PATCH 32/32] Bump version number in package script --- build/package.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/package.sh b/build/package.sh index 0222993..621b3da 100755 --- a/build/package.sh +++ b/build/package.sh @@ -3,7 +3,7 @@ #Us the create-dmg project to create the DMG #git clone https://github.com/andreyvit/yoursway-create-dmg.git -VERSION="1.1" +VERSION="1.2" mkdir -p target/package cp -rf target/Tomighty.app target/package/