22 Commits

Author SHA1 Message Date
Alex Zielenski 88bf570d9b Merge pull request #27 from alexzielenski/dev
0.0.4
2014-07-02 16:29:52 -04:00
Alex Zielenski 5e432efcf8 remove cloud cursor after dragging an image out 2014-07-02 16:26:42 -04:00
Alex Zielenski 23674e6143 Allow dragging in image previews 2014-07-02 16:23:56 -04:00
Alex Zielenski 6aa869ed43 fix contextual menu actions 2014-07-02 16:18:21 -04:00
Alex Zielenski 0d82cd04c8 update credits 2014-07-02 16:17:50 -04:00
Alex Zielenski 1178ffd32e skip hidden files 2014-07-02 16:17:38 -04:00
Alex Zielenski 1cf5830161 fix bug where app wouldn't close if edit window was open when main window was closed 2014-06-19 13:00:33 -04:00
Alex Zielenski a34578a3b9 Merge branch 'master' of github.com:alexzielenski/Mousecape into dev 2014-06-19 12:50:57 -04:00
Alex Zielenski 900313eb22 bump version number 2014-06-19 12:50:19 -04:00
Alex Zielenski 8107a5a0f8 Merge pull request #25 from alexzielenski/dev
Yosemite
2014-06-19 12:49:08 -04:00
Alex Zielenski 3ca8dbf5da bump version 2014-06-19 12:47:22 -04:00
Alex Zielenski 64b67ec1aa more yosemite updates. NSViewControllers are now hooked into the responder chain so rename the menu action methods 2014-06-19 12:45:35 -04:00
Alex Zielenski be0d63e84d don't leak observation info on dealloc 2014-06-19 12:44:50 -04:00
Alex Zielenski 84ca1342c2 This transformer wants a string returned, not an error 2014-06-19 12:44:31 -04:00
Alex Zielenski 57d5c3a78c use weak properties for these outlets 2014-06-19 12:44:09 -04:00
Alex Zielenski 32f1d18ba8 make sure the images are set as template to have them change color automatically 2014-06-19 12:43:47 -04:00
Alex Zielenski f3fdaad3be use -dirty rather than isDirty for the kvo key 2014-06-19 12:43:21 -04:00
Alex Zielenski 992044c873 quit app after main window is closed 2014-06-19 12:41:23 -04:00
Alex Zielenski b3f56427d9 rewrite helper tool to be an app and install it per-user 2014-06-19 12:41:05 -04:00
Alex Zielenski e7b5fe8d03 yosemite removes CGSISCursorRegistered so we have to weakly link it and replace it 2014-06-19 12:37:28 -04:00
Alex Zielenski b1a5d8ca54 add export/dump feature to mousecloak 2014-06-19 12:34:37 -04:00
Alex Zielenski bb25a10604 Add previews in the cape table view, add a border around the hotspot dot, fix blurry drop zones 2014-03-10 17:59:36 -04:00
48 changed files with 1234 additions and 675 deletions
+1
View File
@@ -0,0 +1 @@
WorkspaceSettings.xcsettings
+225 -157
View File
@@ -9,10 +9,14 @@
/* Begin PBXBuildFile section */
FA04886C189F58B1001F3AB5 /* Edit.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA048868189F58B1001F3AB5 /* Edit.xib */; };
FA04886D189F58B1001F3AB5 /* Library.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA04886A189F58B1001F3AB5 /* Library.xib */; };
FA14DE8D18CE596B00A73BF4 /* RBLClipView.m in Sources */ = {isa = PBXBuildFile; fileRef = FA14DE8A18CE596B00A73BF4 /* RBLClipView.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
FA14DE8E18CE596B00A73BF4 /* RBLScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = FA14DE8C18CE596B00A73BF4 /* RBLScrollView.m */; };
FA14DE9118CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = FA14DE9018CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
FA1DC01919527A73009E879C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA359844189DBA3800288163 /* SystemConfiguration.framework */; };
FA1DC01A19527A79009E879C /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA254779189D85890038E1D9 /* ApplicationServices.framework */; };
FA35983F189DA3BC00288163 /* MCPrefs.m in Sources */ = {isa = PBXBuildFile; fileRef = FA35983E189DA3BC00288163 /* MCPrefs.m */; };
FA359840189DA3C100288163 /* MCPrefs.m in Sources */ = {isa = PBXBuildFile; fileRef = FA35983E189DA3BC00288163 /* MCPrefs.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
FA359849189DC40100288163 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA359848189DC40100288163 /* Security.framework */; };
FA35984B189DC48800288163 /* mousecloak in Copy Tools */ = {isa = PBXBuildFile; fileRef = FAC69FAD189D608900BC829D /* mousecloak */; };
FA35984D189DC55A00288163 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA35984C189DC55A00288163 /* ServiceManagement.framework */; };
FA359852189E035900288163 /* listen.m in Sources */ = {isa = PBXBuildFile; fileRef = FA359851189E035900288163 /* listen.m */; };
FA359853189E040D00288163 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA359844189DBA3800288163 /* SystemConfiguration.framework */; };
@@ -20,6 +24,7 @@
FA5107E818A823BD00917185 /* MASPreferencesWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = FA5107E318A823BD00917185 /* MASPreferencesWindowController.m */; };
FA5107ED18A8253600917185 /* MCGeneralPreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = FA5107EB18A8253600917185 /* MCGeneralPreferencesController.m */; };
FA5107EE18A8253600917185 /* GeneralPreferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA5107EC18A8253600917185 /* GeneralPreferences.xib */; };
FA7582B8193D377300CE223C /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA7582B7193D377300CE223C /* ApplicationServices.framework */; };
FA8FF76B189D664400750E51 /* restore.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8FF76A189D664400750E51 /* restore.m */; };
FA8FF76E189D66CB00750E51 /* backup.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8FF76D189D66CB00750E51 /* backup.m */; };
FA8FF771189D66D800750E51 /* apply.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8FF770189D66D800750E51 /* apply.m */; };
@@ -40,10 +45,6 @@
FAC69F78189D603C00BC829D /* MCAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69F77189D603C00BC829D /* MCAppDelegate.m */; };
FAC69F7B189D603C00BC829D /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAC69F79189D603C00BC829D /* MainMenu.xib */; };
FAC69F7D189D603C00BC829D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FAC69F7C189D603C00BC829D /* Images.xcassets */; };
FAC69F84189D603C00BC829D /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAC69F83189D603C00BC829D /* XCTest.framework */; };
FAC69F85189D603C00BC829D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAC69F64189D603C00BC829D /* Cocoa.framework */; };
FAC69F8D189D603C00BC829D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = FAC69F8B189D603C00BC829D /* InfoPlist.strings */; };
FAC69F8F189D603C00BC829D /* MousecapeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69F8E189D603C00BC829D /* MousecapeTests.m */; };
FAC69FB1189D608900BC829D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69FB0189D608900BC829D /* main.m */; };
FAC69FB5189D608900BC829D /* mousecloak.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = FAC69FB4189D608900BC829D /* mousecloak.1 */; };
FAC69FD4189D609B00BC829D /* GBCommandLineParser.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69FCF189D609B00BC829D /* GBCommandLineParser.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
@@ -52,6 +53,18 @@
FAC69FDA189D632B00BC829D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAC69F64189D603C00BC829D /* Cocoa.framework */; };
FAC69FDC189D636700BC829D /* MCDefs.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69FDB189D636700BC829D /* MCDefs.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
FAC69FDD189D636700BC829D /* MCDefs.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69FDB189D636700BC829D /* MCDefs.m */; };
FADBC15118CE51C000B9510F /* DTScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = FADBC15018CE51C000B9510F /* DTScrollView.m */; };
FADBC15418CE535200B9510F /* MCCapePreviewItem.m in Sources */ = {isa = PBXBuildFile; fileRef = FADBC15318CE535200B9510F /* MCCapePreviewItem.m */; };
FAE5D56C1952700B007620DE /* MCDefs.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69FDB189D636700BC829D /* MCDefs.m */; };
FAE5D56D1952700B007620DE /* MCPrefs.m in Sources */ = {isa = PBXBuildFile; fileRef = FA35983E189DA3BC00288163 /* MCPrefs.m */; };
FAE5D5701952700B007620DE /* apply.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8FF770189D66D800750E51 /* apply.m */; };
FAE5D5721952700B007620DE /* listen.m in Sources */ = {isa = PBXBuildFile; fileRef = FA359851189E035900288163 /* listen.m */; };
FAE5D57619527245007620DE /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FAE5D57519527245007620DE /* main.m */; };
FAE5D578195272DD007620DE /* scale.m in Sources */ = {isa = PBXBuildFile; fileRef = FAAEF956189F4ED300145DF8 /* scale.m */; };
FAE5D57B195272F7007620DE /* backup.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8FF76D189D66CB00750E51 /* backup.m */; };
FAE5D57C195272FE007620DE /* restore.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8FF76A189D664400750E51 /* restore.m */; };
FAE5D57E19527359007620DE /* mousecloak in Copy Tool */ = {isa = PBXBuildFile; fileRef = FAC69FAD189D608900BC829D /* mousecloak */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
FAE5D580195273B5007620DE /* com.alexzielenski.mousecloakhelper.app in Copy Helper */ = {isa = PBXBuildFile; fileRef = FAE5D54919526F82007620DE /* com.alexzielenski.mousecloakhelper.app */; };
FAEE652918A047E8003AA182 /* NSFileManager+DirectoryLocations.m in Sources */ = {isa = PBXBuildFile; fileRef = FAEE650A18A047E8003AA182 /* NSFileManager+DirectoryLocations.m */; };
FAEE652A18A047E8003AA182 /* NSOrderedSet+AZSortedInsert.m in Sources */ = {isa = PBXBuildFile; fileRef = FAEE650C18A047E8003AA182 /* NSOrderedSet+AZSortedInsert.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
FAEE652B18A047E8003AA182 /* MCEditCapeController.m in Sources */ = {isa = PBXBuildFile; fileRef = FAEE650F18A047E8003AA182 /* MCEditCapeController.m */; };
@@ -77,27 +90,9 @@
remoteGlobalIDString = FAC69FAC189D608900BC829D;
remoteInfo = mousecloak;
};
FAC69F86189D603C00BC829D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = FAC69F59189D603C00BC829D /* Project object */;
proxyType = 1;
remoteGlobalIDString = FAC69F60189D603C00BC829D;
remoteInfo = Mousecape;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
FA35984A189DC47800288163 /* Copy Tools */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 6;
files = (
FA35984B189DC48800288163 /* mousecloak in Copy Tools */,
);
name = "Copy Tools";
runOnlyForDeploymentPostprocessing = 0;
};
FAC69FAB189D608900BC829D /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -108,11 +103,40 @@
);
runOnlyForDeploymentPostprocessing = 1;
};
FAE5D57D1952734F007620DE /* Copy Tool */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 6;
files = (
FAE5D57E19527359007620DE /* mousecloak in Copy Tool */,
);
name = "Copy Tool";
runOnlyForDeploymentPostprocessing = 0;
};
FAE5D57F1952737F007620DE /* Copy Helper */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = Contents/Library/LoginItems;
dstSubfolderSpec = 1;
files = (
FAE5D580195273B5007620DE /* com.alexzielenski.mousecloakhelper.app in Copy Helper */,
);
name = "Copy Helper";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
FA048869189F58B1001F3AB5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/Edit.xib; sourceTree = "<group>"; };
FA04886B189F58B1001F3AB5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/Library.xib; sourceTree = "<group>"; };
FA14DE8918CE596B00A73BF4 /* RBLClipView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RBLClipView.h; sourceTree = "<group>"; };
FA14DE8A18CE596B00A73BF4 /* RBLClipView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RBLClipView.m; sourceTree = "<group>"; };
FA14DE8B18CE596B00A73BF4 /* RBLScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RBLScrollView.h; sourceTree = "<group>"; };
FA14DE8C18CE596B00A73BF4 /* RBLScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RBLScrollView.m; sourceTree = "<group>"; };
FA14DE8F18CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSColor+RBLCGColorAdditions.h"; sourceTree = "<group>"; };
FA14DE9018CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSColor+RBLCGColorAdditions.m"; sourceTree = "<group>"; };
FA1DC01719527A56009E879C /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
FA254779189D85890038E1D9 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = System/Library/Frameworks/ApplicationServices.framework; sourceTree = SDKROOT; };
FA35983D189DA3BC00288163 /* MCPrefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPrefs.h; sourceTree = "<group>"; };
FA35983E189DA3BC00288163 /* MCPrefs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPrefs.m; sourceTree = "<group>"; };
@@ -128,6 +152,7 @@
FA5107EA18A8253600917185 /* MCGeneralPreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MCGeneralPreferencesController.h; path = Preferences/MCGeneralPreferencesController.h; sourceTree = "<group>"; };
FA5107EB18A8253600917185 /* MCGeneralPreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MCGeneralPreferencesController.m; path = Preferences/MCGeneralPreferencesController.m; sourceTree = "<group>"; };
FA5107EC18A8253600917185 /* GeneralPreferences.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = GeneralPreferences.xib; path = Preferences/GeneralPreferences.xib; sourceTree = "<group>"; };
FA7582B7193D377300CE223C /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = ../../../../../../../../../System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<group>"; };
FA8FF769189D663B00750E51 /* restore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = restore.h; sourceTree = "<group>"; };
FA8FF76A189D664400750E51 /* restore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = restore.m; sourceTree = "<group>"; };
FA8FF76C189D66C400750E51 /* backup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = backup.h; sourceTree = "<group>"; };
@@ -157,11 +182,7 @@
FAC69F77189D603C00BC829D /* MCAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MCAppDelegate.m; sourceTree = "<group>"; };
FAC69F7A189D603C00BC829D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
FAC69F7C189D603C00BC829D /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
FAC69F82189D603C00BC829D /* MousecapeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MousecapeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
FAC69F83189D603C00BC829D /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
FAC69F8A189D603C00BC829D /* MousecapeTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MousecapeTests-Info.plist"; sourceTree = "<group>"; };
FAC69F8C189D603C00BC829D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
FAC69F8E189D603C00BC829D /* MousecapeTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MousecapeTests.m; sourceTree = "<group>"; };
FAC69F9D189D605300BC829D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
FAC69FAD189D608900BC829D /* mousecloak */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = mousecloak; sourceTree = BUILT_PRODUCTS_DIR; };
FAC69FB0189D608900BC829D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
@@ -193,6 +214,13 @@
FAC69FD3189D609B00BC829D /* GBSettings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GBSettings.m; sourceTree = "<group>"; };
FAC69FD7189D623C00BC829D /* Mousecape-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Mousecape-Prefix.pch"; sourceTree = "<group>"; };
FAC69FDB189D636700BC829D /* MCDefs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCDefs.m; sourceTree = "<group>"; };
FADBC14F18CE51C000B9510F /* DTScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DTScrollView.h; sourceTree = "<group>"; };
FADBC15018CE51C000B9510F /* DTScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DTScrollView.m; sourceTree = "<group>"; };
FADBC15218CE535200B9510F /* MCCapePreviewItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCCapePreviewItem.h; sourceTree = "<group>"; };
FADBC15318CE535200B9510F /* MCCapePreviewItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCCapePreviewItem.m; sourceTree = "<group>"; };
FAE5D54919526F82007620DE /* com.alexzielenski.mousecloakhelper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = com.alexzielenski.mousecloakhelper.app; sourceTree = BUILT_PRODUCTS_DIR; };
FAE5D54C19526F82007620DE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
FAE5D57519527245007620DE /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
FAEE650918A047E8003AA182 /* NSFileManager+DirectoryLocations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSFileManager+DirectoryLocations.h"; sourceTree = "<group>"; };
FAEE650A18A047E8003AA182 /* NSFileManager+DirectoryLocations.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileManager+DirectoryLocations.m"; sourceTree = "<group>"; };
FAEE650B18A047E8003AA182 /* NSOrderedSet+AZSortedInsert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSOrderedSet+AZSortedInsert.h"; sourceTree = "<group>"; };
@@ -237,27 +265,41 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
FAC69F7F189D603C00BC829D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
FAC69F85189D603C00BC829D /* Cocoa.framework in Frameworks */,
FAC69F84189D603C00BC829D /* XCTest.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FAC69FAA189D608900BC829D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
FA7582B8193D377300CE223C /* ApplicationServices.framework in Frameworks */,
FA359853189E040D00288163 /* SystemConfiguration.framework in Frameworks */,
FAC69FDA189D632B00BC829D /* Cocoa.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FAE5D54619526F82007620DE /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
FA1DC01A19527A79009E879C /* ApplicationServices.framework in Frameworks */,
FA1DC01919527A73009E879C /* SystemConfiguration.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
FA14DE8818CE596B00A73BF4 /* Rebel */ = {
isa = PBXGroup;
children = (
FA14DE8918CE596B00A73BF4 /* RBLClipView.h */,
FA14DE8A18CE596B00A73BF4 /* RBLClipView.m */,
FA14DE8B18CE596B00A73BF4 /* RBLScrollView.h */,
FA14DE8C18CE596B00A73BF4 /* RBLScrollView.m */,
FA14DE8F18CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.h */,
FA14DE9018CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.m */,
);
path = Rebel;
sourceTree = "<group>";
};
FA5107DD18A823BD00917185 /* MASPreferences */ = {
isa = PBXGroup;
children = (
@@ -282,6 +324,8 @@
FAAEF8EE189EB32700145DF8 /* external */ = {
isa = PBXGroup;
children = (
FA14DE8818CE596B00A73BF4 /* Rebel */,
FADBC14E18CE51C000B9510F /* DTScrollView */,
FA5107DD18A823BD00917185 /* MASPreferences */,
FAAEF8EF189EB32700145DF8 /* BTRKit */,
);
@@ -303,8 +347,8 @@
isa = PBXGroup;
children = (
FAC69F6A189D603C00BC829D /* Mousecape */,
FAC69F88189D603C00BC829D /* MousecapeTests */,
FAC69FAF189D608900BC829D /* mousecloak */,
FAE5D54A19526F82007620DE /* mousecloakHelper */,
FAC69F63189D603C00BC829D /* Frameworks */,
FAC69F62189D603C00BC829D /* Products */,
);
@@ -314,8 +358,8 @@
isa = PBXGroup;
children = (
FAC69F61189D603C00BC829D /* Mousecape.app */,
FAC69F82189D603C00BC829D /* MousecapeTests.xctest */,
FAC69FAD189D608900BC829D /* mousecloak */,
FAE5D54919526F82007620DE /* com.alexzielenski.mousecloakhelper.app */,
);
name = Products;
sourceTree = "<group>";
@@ -323,6 +367,8 @@
FAC69F63189D603C00BC829D /* Frameworks */ = {
isa = PBXGroup;
children = (
FA1DC01719527A56009E879C /* CoreGraphics.framework */,
FA7582B7193D377300CE223C /* ApplicationServices.framework */,
FAAEF8F6189EB34700145DF8 /* QuartzCore.framework */,
FA35984C189DC55A00288163 /* ServiceManagement.framework */,
FA359848189DC40100288163 /* Security.framework */,
@@ -379,24 +425,6 @@
name = "Supporting Files";
sourceTree = "<group>";
};
FAC69F88189D603C00BC829D /* MousecapeTests */ = {
isa = PBXGroup;
children = (
FAC69F8E189D603C00BC829D /* MousecapeTests.m */,
FAC69F89189D603C00BC829D /* Supporting Files */,
);
path = MousecapeTests;
sourceTree = "<group>";
};
FAC69F89189D603C00BC829D /* Supporting Files */ = {
isa = PBXGroup;
children = (
FAC69F8A189D603C00BC829D /* MousecapeTests-Info.plist */,
FAC69F8B189D603C00BC829D /* InfoPlist.strings */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
FAC69FAF189D608900BC829D /* mousecloak */ = {
isa = PBXGroup;
children = (
@@ -478,6 +506,32 @@
path = GBCli;
sourceTree = "<group>";
};
FADBC14E18CE51C000B9510F /* DTScrollView */ = {
isa = PBXGroup;
children = (
FADBC14F18CE51C000B9510F /* DTScrollView.h */,
FADBC15018CE51C000B9510F /* DTScrollView.m */,
);
path = DTScrollView;
sourceTree = "<group>";
};
FAE5D54A19526F82007620DE /* mousecloakHelper */ = {
isa = PBXGroup;
children = (
FAE5D54B19526F82007620DE /* Supporting Files */,
FAE5D57519527245007620DE /* main.m */,
);
path = mousecloakHelper;
sourceTree = "<group>";
};
FAE5D54B19526F82007620DE /* Supporting Files */ = {
isa = PBXGroup;
children = (
FAE5D54C19526F82007620DE /* Info.plist */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
FAEE650818A047E8003AA182 /* categories */ = {
isa = PBXGroup;
children = (
@@ -544,6 +598,8 @@
FAEE652818A047E8003AA182 /* MMAnimatingImageView.m */,
FAEE653718A048EA003AA182 /* MCSpriteLayer.h */,
FAEE653818A048EA003AA182 /* MCSpriteLayer.m */,
FADBC15218CE535200B9510F /* MCCapePreviewItem.h */,
FADBC15318CE535200B9510F /* MCCapePreviewItem.m */,
);
name = views;
path = src/views;
@@ -560,7 +616,8 @@
FAC69F5F189D603C00BC829D /* Resources */,
FAC69F5E189D603C00BC829D /* Frameworks */,
FA359841189DAAF900288163 /* Build Number */,
FA35984A189DC47800288163 /* Copy Tools */,
FAE5D57D1952734F007620DE /* Copy Tool */,
FAE5D57F1952737F007620DE /* Copy Helper */,
);
buildRules = (
);
@@ -572,24 +629,6 @@
productReference = FAC69F61189D603C00BC829D /* Mousecape.app */;
productType = "com.apple.product-type.application";
};
FAC69F81189D603C00BC829D /* MousecapeTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = FAC69F95189D603C00BC829D /* Build configuration list for PBXNativeTarget "MousecapeTests" */;
buildPhases = (
FAC69F7E189D603C00BC829D /* Sources */,
FAC69F7F189D603C00BC829D /* Frameworks */,
FAC69F80189D603C00BC829D /* Resources */,
);
buildRules = (
);
dependencies = (
FAC69F87189D603C00BC829D /* PBXTargetDependency */,
);
name = MousecapeTests;
productName = MousecapeTests;
productReference = FAC69F82189D603C00BC829D /* MousecapeTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
FAC69FAC189D608900BC829D /* mousecloak */ = {
isa = PBXNativeTarget;
buildConfigurationList = FAC69FB6189D608A00BC829D /* Build configuration list for PBXNativeTarget "mousecloak" */;
@@ -607,6 +646,23 @@
productReference = FAC69FAD189D608900BC829D /* mousecloak */;
productType = "com.apple.product-type.tool";
};
FAE5D54819526F82007620DE /* com.alexzielenski.mousecloakhelper */ = {
isa = PBXNativeTarget;
buildConfigurationList = FAE5D56719526F82007620DE /* Build configuration list for PBXNativeTarget "com.alexzielenski.mousecloakhelper" */;
buildPhases = (
FAE5D54519526F82007620DE /* Sources */,
FAE5D54619526F82007620DE /* Frameworks */,
FAE5D54719526F82007620DE /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = com.alexzielenski.mousecloakhelper;
productName = mousecloakHelper;
productReference = FAE5D54919526F82007620DE /* com.alexzielenski.mousecloakhelper.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@@ -614,14 +670,15 @@
isa = PBXProject;
attributes = {
CLASSPREFIX = MC;
LastUpgradeCheck = 0500;
LastUpgradeCheck = 0600;
ORGANIZATIONNAME = "Alex Zielenski";
TargetAttributes = {
FAC69F60189D603C00BC829D = {
DevelopmentTeam = 3GD8ABJ22W;
};
FAC69F81189D603C00BC829D = {
TestTargetID = FAC69F60189D603C00BC829D;
FAE5D54819526F82007620DE = {
CreatedOnToolsVersion = 6.0;
DevelopmentTeam = 3GD8ABJ22W;
};
};
};
@@ -639,8 +696,8 @@
projectRoot = "";
targets = (
FAC69F60189D603C00BC829D /* Mousecape */,
FAC69F81189D603C00BC829D /* MousecapeTests */,
FAC69FAC189D608900BC829D /* mousecloak */,
FAE5D54819526F82007620DE /* com.alexzielenski.mousecloakhelper */,
);
};
/* End PBXProject section */
@@ -661,11 +718,10 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
FAC69F80189D603C00BC829D /* Resources */ = {
FAE5D54719526F82007620DE /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
FAC69F8D189D603C00BC829D /* InfoPlist.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -707,31 +763,28 @@
FAAEF951189F0CC300145DF8 /* restore.m in Sources */,
FAAEF950189EFC9800145DF8 /* apply.m in Sources */,
FAEE652918A047E8003AA182 /* NSFileManager+DirectoryLocations.m in Sources */,
FA14DE9118CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.m in Sources */,
FA5107E818A823BD00917185 /* MASPreferencesWindowController.m in Sources */,
FAEE652D18A047E8003AA182 /* MCEditListController.m in Sources */,
FAC69F71189D603C00BC829D /* main.m in Sources */,
FAEE653218A047E8003AA182 /* MCCursor.m in Sources */,
FAAEF958189F4F8200145DF8 /* scale.m in Sources */,
FAEE653418A047E8003AA182 /* MCFormatters.m in Sources */,
FA14DE8E18CE596B00A73BF4 /* RBLScrollView.m in Sources */,
FAAEF8F4189EB32700145DF8 /* BTRClipView.m in Sources */,
FAAEF8F5189EB32700145DF8 /* BTRScrollView.m in Sources */,
FAC69FDC189D636700BC829D /* MCDefs.m in Sources */,
FAEE652E18A047E8003AA182 /* MCEditWindowController.m in Sources */,
FA359840189DA3C100288163 /* MCPrefs.m in Sources */,
FAEE652B18A047E8003AA182 /* MCEditCapeController.m in Sources */,
FADBC15418CE535200B9510F /* MCCapePreviewItem.m in Sources */,
FAEE652A18A047E8003AA182 /* NSOrderedSet+AZSortedInsert.m in Sources */,
FADBC15118CE51C000B9510F /* DTScrollView.m in Sources */,
FA14DE8D18CE596B00A73BF4 /* RBLClipView.m in Sources */,
FAEE653518A047E8003AA182 /* MCCapeCellView.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FAC69F7E189D603C00BC829D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
FAC69F8F189D603C00BC829D /* MousecapeTests.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FAC69FA9189D608900BC829D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -751,6 +804,21 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
FAE5D54519526F82007620DE /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
FAE5D57C195272FE007620DE /* restore.m in Sources */,
FAE5D57B195272F7007620DE /* backup.m in Sources */,
FAE5D57619527245007620DE /* main.m in Sources */,
FAE5D56C1952700B007620DE /* MCDefs.m in Sources */,
FAE5D56D1952700B007620DE /* MCPrefs.m in Sources */,
FAE5D5701952700B007620DE /* apply.m in Sources */,
FAE5D5721952700B007620DE /* listen.m in Sources */,
FAE5D578195272DD007620DE /* scale.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
@@ -759,11 +827,6 @@
target = FAC69FAC189D608900BC829D /* mousecloak */;
targetProxy = FA359846189DBEB700288163 /* PBXContainerItemProxy */;
};
FAC69F87189D603C00BC829D /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = FAC69F60189D603C00BC829D /* Mousecape */;
targetProxy = FAC69F86189D603C00BC829D /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
@@ -807,14 +870,6 @@
name = MainMenu.xib;
sourceTree = "<group>";
};
FAC69F8B189D603C00BC829D /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
FAC69F8C189D603C00BC829D /* en */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
@@ -833,6 +888,7 @@
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "Developer ID Application";
COPY_PHASE_STRIP = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
@@ -852,7 +908,7 @@
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.8;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx10.8;
SDKROOT = macosx10.9;
};
name = Debug;
};
@@ -871,6 +927,7 @@
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "Developer ID Application";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
@@ -884,7 +941,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.8;
SDKROOT = macosx10.8;
SDKROOT = macosx10.9;
};
name = Release;
};
@@ -892,11 +949,11 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "Developer ID Application";
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Mousecape/Mousecape-Prefix.pch";
INFOPLIST_FILE = "Mousecape/Mousecape-Info.plist";
MACOSX_DEPLOYMENT_TARGET = 10.9;
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
@@ -906,61 +963,20 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "Developer ID Application";
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Mousecape/Mousecape-Prefix.pch";
INFOPLIST_FILE = "Mousecape/Mousecape-Info.plist";
MACOSX_DEPLOYMENT_TARGET = 10.9;
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
name = Release;
};
FAC69F96189D603C00BC829D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Mousecape.app/Contents/MacOS/Mousecape";
COMBINE_HIDPI_IMAGES = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(DEVELOPER_FRAMEWORKS_DIR)",
"$(inherited)",
);
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Mousecape/Mousecape-Prefix.pch";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
INFOPLIST_FILE = "MousecapeTests/MousecapeTests-Info.plist";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUNDLE_LOADER)";
WRAPPER_EXTENSION = xctest;
};
name = Debug;
};
FAC69F97189D603C00BC829D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Mousecape.app/Contents/MacOS/Mousecape";
COMBINE_HIDPI_IMAGES = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(DEVELOPER_FRAMEWORKS_DIR)",
"$(inherited)",
);
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Mousecape/Mousecape-Prefix.pch";
INFOPLIST_FILE = "MousecapeTests/MousecapeTests-Info.plist";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUNDLE_LOADER)";
WRAPPER_EXTENSION = xctest;
};
name = Release;
};
FAC69FB7189D608A00BC829D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = NO;
CODE_SIGN_IDENTITY = "Developer ID Application";
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "mousecloak/mousecloak-Prefix.pch";
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -980,7 +996,6 @@
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = NO;
CODE_SIGN_IDENTITY = "Developer ID Application";
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "mousecloak/mousecloak-Prefix.pch";
HEADER_SEARCH_PATHS = (
@@ -992,6 +1007,59 @@
};
name = Release;
};
FAE5D56319526F82007620DE /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = NO;
CLANG_WARN_UNREACHABLE_CODE = YES;
COMBINE_HIDPI_IMAGES = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "mousecloak/mousecloak-Prefix.pch";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include",
"$(PROJECT_DIR)/mousecloak/vendor",
);
INFOPLIST_FILE = mousecloakHelper/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
METAL_ENABLE_DEBUG_INFO = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
FAE5D56419526F82007620DE /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = NO;
CLANG_WARN_UNREACHABLE_CODE = YES;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "mousecloak/mousecloak-Prefix.pch";
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include",
"$(PROJECT_DIR)/mousecloak/vendor",
);
INFOPLIST_FILE = mousecloakHelper/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
METAL_ENABLE_DEBUG_INFO = NO;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -1013,15 +1081,6 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
FAC69F95189D603C00BC829D /* Build configuration list for PBXNativeTarget "MousecapeTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
FAC69F96189D603C00BC829D /* Debug */,
FAC69F97189D603C00BC829D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
FAC69FB6189D608A00BC829D /* Build configuration list for PBXNativeTarget "mousecloak" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -1031,6 +1090,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
FAE5D56719526F82007620DE /* Build configuration list for PBXNativeTarget "com.alexzielenski.mousecloakhelper" */ = {
isa = XCConfigurationList;
buildConfigurations = (
FAE5D56319526F82007620DE /* Debug */,
FAE5D56419526F82007620DE /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = FAC69F59189D603C00BC829D /* Project object */;
@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0600"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAE5D54819526F82007620DE"
BuildableName = "com.alexzielenski.mousecloakhelper.app"
BlueprintName = "com.alexzielenski.mousecloakhelper"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAE5D54819526F82007620DE"
BuildableName = "com.alexzielenski.mousecloakhelper.app"
BlueprintName = "com.alexzielenski.mousecloakhelper"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</MacroExpansion>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAE5D54819526F82007620DE"
BuildableName = "com.alexzielenski.mousecloakhelper.app"
BlueprintName = "com.alexzielenski.mousecloakhelper"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAE5D54819526F82007620DE"
BuildableName = "com.alexzielenski.mousecloakhelper.app"
BlueprintName = "com.alexzielenski.mousecloakhelper"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -14,6 +14,11 @@
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>mousecloakHelper.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
@@ -37,6 +42,16 @@
<key>primary</key>
<true/>
</dict>
<key>FAE5D54819526F82007620DE</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>FAE5D55A19526F82007620DE</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>
+93 -123
View File
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4514" systemVersion="13C48" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6154.21" systemVersion="13D65" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment defaultVersion="1080" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6154.21"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MCEditWindowController">
@@ -16,7 +15,7 @@
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" wantsToBeColor="NO" animationBehavior="default" id="1">
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="1" customClass="NSPanel">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<rect key="contentRect" x="196" y="240" width="525" height="297"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/>
@@ -27,21 +26,18 @@
<subviews>
<splitView canDrawConcurrently="YES" dividerStyle="thin" vertical="YES" translatesAutoresizingMaskIntoConstraints="NO" id="3cj-R9-WKK">
<rect key="frame" x="0.0" y="0.0" width="525" height="297"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<customView id="IHY-vi-Wpr">
<rect key="frame" x="0.0" y="0.0" width="135" height="297"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView canDrawConcurrently="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2UQ-R4-qJn">
<scrollView canDrawConcurrently="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="34" horizontalPageScroll="10" verticalLineScroll="34" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2UQ-R4-qJn">
<rect key="frame" x="0.0" y="22" width="135" height="275"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" copiesOnScroll="NO" id="ame-2S-JV7">
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="ame-2S-JV7">
<rect key="frame" x="0.0" y="0.0" width="135" height="275"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowSizeStyle="automatic" viewBased="YES" id="MU4-Yh-0PJ">
<rect key="frame" x="0.0" y="0.0" width="135" height="275"/>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="32" rowSizeStyle="automatic" viewBased="YES" id="MU4-Yh-0PJ">
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
@@ -66,7 +62,6 @@
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="tn7-kB-Fvu">
<rect key="frame" x="6" y="8" width="120" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="8we-kW-bNk">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -97,7 +92,6 @@
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="W6i-Uv-3TI">
<rect key="frame" x="6" y="0.0" width="120" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="8bB-Ws-20v">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -128,20 +122,17 @@
</connections>
</tableView>
</subviews>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<nil key="backgroundColor"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="ARR-bd-5zK">
<rect key="frame" x="0.0" y="-16" width="0.0" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="3rZ-7d-Mro">
<rect key="frame" x="-16" y="0.0" width="16" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<button translatesAutoresizingMaskIntoConstraints="NO" id="0ps-WH-ASN">
<rect key="frame" x="0.0" y="0.0" width="22" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="width" constant="22" id="Fdb-xA-sn9"/>
<constraint firstAttribute="height" constant="22" id="iNY-lh-RsQ"/>
@@ -156,7 +147,6 @@
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="w4h-lB-jLi">
<rect key="frame" x="22" y="0.0" width="22" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="width" constant="22" id="L21-Ci-myo"/>
<constraint firstAttribute="height" constant="22" id="M80-94-gpJ"/>
@@ -169,9 +159,8 @@
<action selector="removeAction:" target="oUs-Nv-PHw" id="JjR-lV-zwz"/>
</connections>
</button>
<box autoresizesSubviews="NO" verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="UJO-Hw-fRK">
<box verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="UJO-Hw-fRK">
<rect key="frame" x="0.0" y="19" width="135" height="5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="NYz-xn-F0g"/>
</constraints>
@@ -221,6 +210,7 @@
<binding destination="oUs-Nv-PHw" name="title" keyPath="cursorLibrary.name" id="RKE-nQ-CzI"/>
<outlet property="delegate" destination="-2" id="4"/>
</connections>
<point key="canvasLocation" x="399.5" y="275.5"/>
</window>
<viewController title="List" id="oUs-Nv-PHw" customClass="MCEditListController">
<connections>
@@ -247,45 +237,40 @@
<rect key="frame" x="0.0" y="0.0" width="504" height="321"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="X2i-rg-HDg">
<rect key="frame" x="18" y="259" width="65" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="X2i-rg-HDg">
<rect key="frame" x="18" y="259" width="62" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Author:" id="Oyi-AW-60U">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="yyn-IO-TkO">
<rect key="frame" x="18" y="209" width="65" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="yyn-IO-TkO">
<rect key="frame" x="18" y="209" width="62" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Version:" id="98i-gH-tf4">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ELX-ej-rTb">
<rect key="frame" x="18" y="234" width="65" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ELX-ej-rTb">
<rect key="frame" x="18" y="234" width="62" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Identifier:" id="Xzj-Uq-4bW">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="CTE-6h-rbf">
<rect key="frame" x="18" y="284" width="65" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="CTE-6h-rbf">
<rect key="frame" x="18" y="284" width="62" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Name:" id="oMS-dL-nZj">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bim-1a-xuh">
<rect key="frame" x="89" y="281" width="395" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bim-1a-xuh">
<rect key="frame" x="86" y="281" width="398" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="07X-ce-vmv">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -296,9 +281,8 @@
<outlet property="nextKeyView" destination="xy3-2B-C0h" id="kJW-OZ-1NO"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xy3-2B-C0h">
<rect key="frame" x="89" y="256" width="395" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xy3-2B-C0h">
<rect key="frame" x="86" y="256" width="398" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="fmY-Bj-OnI">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -309,9 +293,8 @@
<outlet property="nextKeyView" destination="XYx-UL-WbM" id="74w-oc-ff2"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XYx-UL-WbM">
<rect key="frame" x="89" y="231" width="395" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="XYx-UL-WbM">
<rect key="frame" x="86" y="231" width="398" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="sjK-hK-kfo">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -326,9 +309,8 @@
<outlet property="nextKeyView" destination="car-it-RsL" id="uaw-jj-8AW"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="car-it-RsL">
<rect key="frame" x="89" y="206" width="395" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="car-it-RsL">
<rect key="frame" x="86" y="206" width="398" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="qW0-CC-89l">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -339,18 +321,16 @@
<outlet property="nextKeyView" destination="MJr-Jz-5Cq" id="sfZ-oa-g3c"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="i5v-yD-weq">
<rect key="frame" x="18" y="184" width="65" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="i5v-yD-weq">
<rect key="frame" x="18" y="184" width="62" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Retina:" id="HFS-GR-guB">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="MJr-Jz-5Cq">
<rect key="frame" x="87" y="182" width="18" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="MJr-Jz-5Cq">
<rect key="frame" x="84" y="182" width="18" height="18"/>
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="overlaps" state="on" inset="2" id="Ma9-Ke-hYa">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
@@ -408,45 +388,40 @@
<rect key="frame" x="0.0" y="0.0" width="509" height="321"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Dm8-Mj-s5f">
<rect key="frame" x="18" y="284" width="107" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Dm8-Mj-s5f">
<rect key="frame" x="18" y="284" width="103" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Type:" id="dy9-JM-4d7">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="D5V-CV-BuE">
<rect key="frame" x="18" y="259" width="107" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="D5V-CV-BuE">
<rect key="frame" x="18" y="259" width="103" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Frames:" id="G4c-OI-avP">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zEj-zS-uzh">
<rect key="frame" x="18" y="234" width="107" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zEj-zS-uzh">
<rect key="frame" x="18" y="234" width="103" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Frame Duration:" id="5Wb-pc-8jV">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="aso-MD-Alm">
<rect key="frame" x="18" y="209" width="107" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="aso-MD-Alm">
<rect key="frame" x="18" y="209" width="103" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Hot Spot:" id="dcq-3r-2DB">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="yz7-y5-TxE">
<rect key="frame" x="131" y="277" width="358" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButton verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="yz7-y5-TxE">
<rect key="frame" x="127" y="277" width="362" height="25"/>
<popUpButtonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="gKl-8J-X0X">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@@ -456,8 +431,8 @@
<binding destination="tMj-cQ-hK0" name="selectedValue" keyPath="cursor.identifier" id="2aq-Lm-1Lm">
<dictionary key="options">
<string key="NSMultipleValuesPlaceholder">Unknown</string>
<string key="NSNotApplicablePlaceholder">Unknown</string>
<string key="NSNoSelectionPlaceholder">Unknown</string>
<string key="NSNotApplicablePlaceholder">Unknown</string>
<string key="NSNullPlaceholder">Unknown</string>
<string key="NSValueTransformerName">MCCursorTypeValueTransformer</string>
</dictionary>
@@ -465,17 +440,12 @@
<outlet property="nextKeyView" destination="rms-zC-s1M" id="yfu-3L-R4w"/>
</connections>
</popUpButton>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rms-zC-s1M">
<rect key="frame" x="131" y="254" width="358" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rms-zC-s1M">
<rect key="frame" x="127" y="254" width="362" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="1" drawsBackground="YES" id="tKY-dX-ibT">
<numberFormatter key="formatter" formatterBehavior="default10_4" positiveFormat="#" negativeFormat="#" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" minimumFractionDigits="0" maximumFractionDigits="0" id="JEt-qW-Py5">
<real key="roundingIncrement" value="0.0"/>
<numberFormatter key="formatter" formatterBehavior="default10_4" positiveFormat="#" negativeFormat="#" usesGroupingSeparator="NO" paddingCharacter="*" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" decimalSeparator="." groupingSeparator="," currencyDecimalSeparator="." plusSign="+" minusSign="-" notANumberSymbol="NaN" perMillSymbol="‰" percentSymbol="%" exponentSymbol="E" positivePrefix="" positiveSuffix="" negativePrefix="-" negativeSuffix="" id="JEt-qW-Py5">
<real key="minimum" value="1"/>
<real key="maximum" value="24"/>
<metadata>
<bool key="localizesFormat" value="YES"/>
</metadata>
</numberFormatter>
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -486,16 +456,11 @@
<outlet property="nextKeyView" destination="VbK-WJ-M0L" id="y5I-kM-hNq"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="VbK-WJ-M0L">
<rect key="frame" x="131" y="229" width="358" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="VbK-WJ-M0L">
<rect key="frame" x="127" y="229" width="362" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="0.0" drawsBackground="YES" id="pqX-MB-QME">
<numberFormatter key="formatter" formatterBehavior="custom10_4" positiveFormat="#.################" negativeFormat="#.################" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" minimumFractionDigits="0" maximumFractionDigits="16" id="QTS-o7-aVO">
<real key="roundingIncrement" value="0.0"/>
<numberFormatter key="formatter" formatterBehavior="custom10_4" positiveFormat="#.################" negativeFormat="#.################" usesGroupingSeparator="NO" paddingCharacter="*" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" maximumFractionDigits="16" decimalSeparator="." groupingSeparator="," currencyDecimalSeparator="." plusSign="+" minusSign="-" notANumberSymbol="NaN" perMillSymbol="‰" percentSymbol="%" exponentSymbol="E" positivePrefix="" positiveSuffix="" negativePrefix="-" negativeSuffix="" id="QTS-o7-aVO">
<real key="minimum" value="0.0"/>
<metadata>
<bool key="localizesFormat" value="YES"/>
</metadata>
</numberFormatter>
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -506,9 +471,8 @@
<outlet property="nextKeyView" destination="Qcr-83-Tz0" id="gYj-Hj-Txi"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Qcr-83-Tz0">
<rect key="frame" x="131" y="204" width="358" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Qcr-83-Tz0">
<rect key="frame" x="127" y="204" width="362" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="{0,0}" drawsBackground="YES" id="BWu-hw-sDX">
<customFormatter key="formatter" id="hAv-1z-0Jg" customClass="MCPointFormatter"/>
<font key="font" metaFont="system"/>
@@ -520,86 +484,78 @@
<outlet property="nextKeyView" destination="wdB-yr-r6Y" id="Smn-hK-iP2"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="75v-aw-FbU">
<rect key="frame" x="143" y="98" width="24" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="75v-aw-FbU">
<rect key="frame" x="140" y="98" width="23" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="1x" id="FZ3-qB-kDI">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Hoi-Pr-5wz">
<rect key="frame" x="199" y="98" width="24" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Hoi-Pr-5wz">
<rect key="frame" x="196" y="98" width="23" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="2x" id="WI8-sV-4D6">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="CWo-oD-OZX">
<rect key="frame" x="255" y="98" width="24" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="CWo-oD-OZX">
<rect key="frame" x="253" y="98" width="23" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="5x" id="4fS-Q1-prn">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ryz-mP-wNx">
<rect key="frame" x="307" y="98" width="32" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ryz-mP-wNx">
<rect key="frame" x="306" y="98" width="31" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="10x" id="8fp-Ws-ruA">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="j7v-U4-eMe" customClass="MMAnimatingImageView">
<rect key="frame" x="131" y="123" width="48" height="48"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="width" constant="48" id="MeC-cf-abQ"/>
<constraint firstAttribute="height" constant="48" id="VAO-nl-ZmQ"/>
</constraints>
<connections>
<outlet property="delegate" destination="tMj-cQ-hK0" id="YBU-cQ-gUX"/>
</connections>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="ggE-Pd-aWo" customClass="MMAnimatingImageView">
<rect key="frame" x="187" y="123" width="48" height="48"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<customView misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ggE-Pd-aWo" customClass="MMAnimatingImageView">
<rect key="frame" x="183" y="123" width="49" height="48"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldShowHotSpot" value="YES"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldAllowDragging" value="YES"/>
</userDefinedRuntimeAttributes>
<connections>
<outlet property="delegate" destination="tMj-cQ-hK0" id="Q6h-vm-kaw"/>
</connections>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="G3t-wd-E5Y" customClass="MMAnimatingImageView">
<rect key="frame" x="243" y="123" width="48" height="48"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<customView misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="G3t-wd-E5Y" customClass="MMAnimatingImageView">
<rect key="frame" x="240" y="123" width="49" height="48"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldShowHotSpot" value="YES"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldAllowDragging" value="YES"/>
</userDefinedRuntimeAttributes>
<connections>
<outlet property="delegate" destination="tMj-cQ-hK0" id="VPL-GA-4fS"/>
</connections>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="4hN-Nm-B7Z" customClass="MMAnimatingImageView">
<rect key="frame" x="299" y="123" width="48" height="48"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<customView misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4hN-Nm-B7Z" customClass="MMAnimatingImageView">
<rect key="frame" x="297" y="123" width="49" height="48"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldShowHotSpot" value="YES"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldAllowDragging" value="YES"/>
</userDefinedRuntimeAttributes>
<connections>
<outlet property="delegate" destination="tMj-cQ-hK0" id="fp1-eX-JUN"/>
</connections>
</customView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OAt-gN-EX5">
<rect key="frame" x="18" y="184" width="107" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="OAt-gN-EX5">
<rect key="frame" x="18" y="184" width="103" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Size:" id="FrC-7p-0Bq">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="wdB-yr-r6Y">
<rect key="frame" x="131" y="179" width="358" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wdB-yr-r6Y">
<rect key="frame" x="127" y="179" width="362" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="{0,0}" drawsBackground="YES" id="OmM-g8-Kyd">
<customFormatter key="formatter" id="wEf-m3-oYM" customClass="MCSizeFormatter"/>
<font key="font" metaFont="system"/>
@@ -611,6 +567,20 @@
<outlet property="nextKeyView" destination="yz7-y5-TxE" id="9Cb-FK-ium"/>
</connections>
</textField>
<customView misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="j7v-U4-eMe" customClass="MMAnimatingImageView">
<rect key="frame" x="127" y="123" width="48" height="48"/>
<constraints>
<constraint firstAttribute="width" constant="48" id="MeC-cf-abQ"/>
<constraint firstAttribute="height" constant="48" id="VAO-nl-ZmQ"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldShowHotSpot" value="YES"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldAllowDragging" value="YES"/>
</userDefinedRuntimeAttributes>
<connections>
<outlet property="delegate" destination="tMj-cQ-hK0" id="YBU-cQ-gUX"/>
</connections>
</customView>
</subviews>
<constraints>
<constraint firstItem="CWo-oD-OZX" firstAttribute="top" secondItem="G3t-wd-E5Y" secondAttribute="bottom" constant="8" id="3wX-8h-O6z"/>
@@ -708,4 +678,4 @@
<image name="NSAddTemplate" width="8" height="8"/>
<image name="NSRemoveTemplate" width="8" height="8"/>
</resources>
</document>
</document>
+55 -30
View File
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4514" systemVersion="13C48" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6154.21" systemVersion="13D65" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment defaultVersion="1080" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6154.21"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MCLibraryWindowController">
@@ -14,7 +13,7 @@
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<window title="Mousecape" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" wantsToBeColor="NO" frameAutosaveName="LibraryWindow" animationBehavior="default" id="1">
<window title="Mousecape" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" frameAutosaveName="LibraryWindow" animationBehavior="default" id="1">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<rect key="contentRect" x="196" y="240" width="711" height="311"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/>
@@ -23,15 +22,13 @@
<rect key="frame" x="0.0" y="0.0" width="711" height="311"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView canDrawConcurrently="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="29" horizontalPageScroll="10" verticalLineScroll="29" verticalPageScroll="10" translatesAutoresizingMaskIntoConstraints="NO" id="2Io-MC-n6O" customClass="BTRScrollView">
<scrollView canDrawConcurrently="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="84" horizontalPageScroll="10" verticalLineScroll="84" verticalPageScroll="10" translatesAutoresizingMaskIntoConstraints="NO" id="2Io-MC-n6O" customClass="BTRScrollView">
<rect key="frame" x="0.0" y="0.0" width="711" height="311"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" copiesOnScroll="NO" id="VhH-tn-4Sf" customClass="BTRClipView">
<rect key="frame" x="0.0" y="0.0" width="711" height="311"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowSizeStyle="automatic" viewBased="YES" id="dPn-85-uPK">
<rect key="frame" x="0.0" y="0.0" width="711" height="311"/>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="72" rowSizeStyle="automatic" viewBased="YES" id="dPn-85-uPK">
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="12"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
@@ -51,12 +48,11 @@
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView id="syZ-Eq-Lt2" customClass="MCCapeCellView">
<rect key="frame" x="1" y="6" width="708" height="64"/>
<rect key="frame" x="1" y="6" width="708" height="72"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Hfe-RO-hVE">
<rect key="frame" x="18" y="47" width="99" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Hfe-RO-hVE">
<rect key="frame" x="18" y="55" width="97" height="17"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="0kt-g0-cQb">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -66,9 +62,8 @@
<binding destination="syZ-Eq-Lt2" name="value" keyPath="objectValue.name" id="YHc-x9-wXk"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bEa-BS-ghQ">
<rect key="frame" x="117" y="47" width="48" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bEa-BS-ghQ">
<rect key="frame" x="115" y="55" width="48" height="14"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Subtitle" id="NXa-Ze-OX2">
<font key="font" metaFont="smallSystemBold"/>
<color key="textColor" name="headerColor" catalog="System" colorSpace="catalog"/>
@@ -79,14 +74,12 @@
</connections>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="jdV-zx-iTs">
<rect key="frame" x="634" y="44" width="16" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<rect key="frame" x="634" y="52" width="16" height="16"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="applied" id="bwh-k2-aAS"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="QMa-EX-Son">
<rect key="frame" x="658" y="43" width="30" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="HD" id="LsJ-S8-jwy"/>
<rect key="frame" x="658" y="51" width="30" height="18"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="HDTemplate" id="LsJ-S8-jwy"/>
<connections>
<binding destination="syZ-Eq-Lt2" name="value" keyPath="objectValue.hiDPI" id="LcB-QZ-MhG">
<dictionary key="options">
@@ -95,6 +88,31 @@
</binding>
</connections>
</imageView>
<scrollView canDrawConcurrently="YES" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasVerticalScroller="NO" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="odP-lr-hJH" customClass="DTScrollView">
<rect key="frame" x="20" y="3" width="668" height="44"/>
<clipView key="contentView" copiesOnScroll="NO" id="pc3-Zb-Oqk">
<rect key="frame" x="1" y="1" width="666" height="42"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<collectionView id="dyM-T9-60O">
<rect key="frame" x="0.0" y="0.0" width="666" height="42"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="primaryBackgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</collectionView>
</subviews>
</clipView>
<constraints>
<constraint firstAttribute="height" constant="44" id="KzC-9x-FvO"/>
</constraints>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="mwj-HT-8PV">
<rect key="frame" x="1" y="144" width="233" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="cCy-Hj-b5W">
<rect key="frame" x="-100" y="-100" width="15" height="143"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews>
<constraints>
<constraint firstItem="Hfe-RO-hVE" firstAttribute="leading" secondItem="syZ-Eq-Lt2" secondAttribute="leading" constant="20" symbolic="YES" id="OHp-3c-ujO"/>
@@ -102,12 +120,17 @@
<constraint firstItem="bEa-BS-ghQ" firstAttribute="leading" secondItem="Hfe-RO-hVE" secondAttribute="trailing" constant="4" id="WVM-Wd-XXI"/>
<constraint firstItem="jdV-zx-iTs" firstAttribute="centerY" secondItem="QMa-EX-Son" secondAttribute="centerY" id="YLI-IS-v1N"/>
<constraint firstItem="bEa-BS-ghQ" firstAttribute="baseline" secondItem="Hfe-RO-hVE" secondAttribute="baseline" id="bCc-gQ-FVG"/>
<constraint firstAttribute="trailing" secondItem="odP-lr-hJH" secondAttribute="trailing" constant="20" symbolic="YES" id="fnI-G1-FZh"/>
<constraint firstItem="odP-lr-hJH" firstAttribute="leading" secondItem="syZ-Eq-Lt2" secondAttribute="leading" constant="20" symbolic="YES" id="joq-b0-pEr"/>
<constraint firstAttribute="trailing" secondItem="QMa-EX-Son" secondAttribute="trailing" constant="20" symbolic="YES" id="oL8-Zy-vvE"/>
<constraint firstItem="QMa-EX-Son" firstAttribute="top" secondItem="syZ-Eq-Lt2" secondAttribute="top" constant="3" id="oPR-SR-Gh8"/>
<constraint firstItem="odP-lr-hJH" firstAttribute="top" secondItem="Hfe-RO-hVE" secondAttribute="bottom" constant="8" symbolic="YES" id="r5F-n8-O3W"/>
<constraint firstItem="Hfe-RO-hVE" firstAttribute="top" secondItem="syZ-Eq-Lt2" secondAttribute="top" id="wWd-7q-n1a"/>
</constraints>
<connections>
<outlet property="appliedImageView" destination="jdV-zx-iTs" id="4DM-pV-X1T"/>
<outlet property="collectionView" destination="dyM-T9-60O" id="eOd-8D-OEK"/>
<outlet property="resolutionImageView" destination="QMa-EX-Son" id="Tr1-E9-rir"/>
<outlet property="subtitleField" destination="bEa-BS-ghQ" id="yeA-RV-Aoi"/>
<outlet property="textField" destination="Hfe-RO-hVE" id="LWw-Ls-hnr"/>
<outlet property="titleField" destination="Hfe-RO-hVE" id="y7O-VO-62y"/>
@@ -126,11 +149,9 @@
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="uK0-YP-77b">
<rect key="frame" x="1" y="1" width="0.0" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="q1a-eU-6AV">
<rect key="frame" x="-15" y="17" width="16" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
@@ -145,6 +166,7 @@
<connections>
<outlet property="delegate" destination="-2" id="4"/>
</connections>
<point key="canvasLocation" x="591.5" y="159.5"/>
</window>
<viewController title="Library" id="zL4-Ay-t4Q" customClass="MCLibraryViewController">
<connections>
@@ -160,17 +182,17 @@
DQ
</string>
<connections>
<action selector="applyCape:" target="-1" id="KG6-81-DdR"/>
<action selector="applyCapeAction:" target="-1" id="KHK-0n-gS3"/>
</connections>
</menuItem>
<menuItem title="Edit" tag="-1" keyEquivalent="e" id="HJc-SX-JjZ">
<connections>
<action selector="editCape:" target="-1" id="6nG-0d-9YV"/>
<action selector="editCapeAction:" target="-1" id="xUA-Zj-ToX"/>
</connections>
</menuItem>
<menuItem title="Duplicate" tag="-1" keyEquivalent="S" id="PhG-Ll-nqz">
<connections>
<action selector="duplicateCape:" target="-1" id="N0m-Bu-OYJ"/>
<action selector="duplicateCapeAction:" target="-1" id="3xf-LP-P1p"/>
</connections>
</menuItem>
<menuItem title="Remove" tag="-1" id="Aig-wl-ivn">
@@ -178,14 +200,14 @@ DQ
CA
</string>
<connections>
<action selector="removeCape:" target="-1" id="rSg-Ns-VmO"/>
<action selector="removeCapeAction:" target="-1" id="Psf-74-zsG"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="A7P-y0-FBc"/>
<menuItem title="Show in Finder" tag="-1" id="2WM-EN-kiI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="showCape:" target="-1" id="Wu1-o2-zZP"/>
<action selector="showCapeAction:" target="-1" id="iF0-eu-Du4"/>
</connections>
</menuItem>
</items>
@@ -196,7 +218,6 @@ CA
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="cSP-XN-7we">
<rect key="frame" x="-2" y="3" width="245" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" alignment="right" title="Applied Cursor: None" usesSingleLineMode="YES" id="vZ3-2R-psO">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -222,9 +243,13 @@ CA
<constraint firstItem="cSP-XN-7we" firstAttribute="leading" secondItem="3Ui-b0-Yod" secondAttribute="leading" id="eoA-bD-pz5"/>
</constraints>
</customView>
<view id="smV-Cs-4aH">
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
<autoresizingMask key="autoresizingMask"/>
</view>
</objects>
<resources>
<image name="HD" width="30" height="18"/>
<image name="HDTemplate" width="30" height="18"/>
<image name="applied" width="16" height="16"/>
</resources>
</document>
</document>
+9 -10
View File
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4514" systemVersion="13C48" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6154.21" systemVersion="13D65" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment defaultVersion="1080" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6154.21"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@@ -333,12 +332,12 @@
DQ
</string>
<connections>
<action selector="applyCape:" target="-1" id="vf2-1W-mzE"/>
<action selector="applyCapeAction:" target="-1" id="RAI-pM-j7M"/>
</connections>
</menuItem>
<menuItem title="Edit Cape" keyEquivalent="e" id="5qb-Dw-38q">
<connections>
<action selector="editCape:" target="-1" id="iz5-Ek-fyU"/>
<action selector="editCapeAction:" target="-1" id="E2d-D2-Hj9"/>
</connections>
</menuItem>
<menuItem title="Remove Cape" id="LHh-1u-bK8">
@@ -346,24 +345,24 @@ DQ
CA
</string>
<connections>
<action selector="removeCape:" target="-1" id="1E1-e1-eeH"/>
<action selector="removeCapeAction:" target="-1" id="RE5-YE-iAt"/>
</connections>
</menuItem>
<menuItem title="Duplicate Cape" keyEquivalent="S" id="d9b-6w-ubr">
<connections>
<action selector="duplicateCape:" target="-1" id="pOn-FS-ePg"/>
<action selector="duplicateCapeAction:" target="-1" id="Nj7-Uf-gOO"/>
</connections>
</menuItem>
<menuItem title="Check for Updates" hidden="YES" keyEquivalent="u" id="XTi-86-ese">
<connections>
<action selector="checkCape:" target="-1" id="yBL-WC-dbi"/>
<action selector="checkCapeAction:" target="-1" id="q4O-FG-Rle"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="EOT-Rk-oU3"/>
<menuItem title="Show in Finder" id="PAd-kz-Eoi">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="showCape:" target="-1" id="lep-7W-NSD"/>
<action selector="showCapeAction:" target="-1" id="9mC-pd-eiq"/>
</connections>
</menuItem>
<menuItem title="Restore Defaults" keyEquivalent="r" id="uCE-YB-8VL">
@@ -419,4 +418,4 @@ CA
</customObject>
<customObject id="420" customClass="NSFontManager"/>
</objects>
</document>
</document>
+29 -67
View File
@@ -14,8 +14,6 @@
#import "MASPreferencesWindowController.h"
#import "MCGeneralPreferencesController.h"
static AuthorizationRef obtainRights();
@interface MCAppDelegate () {
MASPreferencesWindowController *_preferencesWindowController;
}
@@ -32,8 +30,7 @@ static AuthorizationRef obtainRights();
[self.libraryWindowController showWindow:self];
}
- (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag {
[self.libraryWindowController showWindow:sender];
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
return YES;
}
@@ -47,54 +44,42 @@ static AuthorizationRef obtainRights();
}
- (void)configureHelperToolMenuItem {
NSString *mouseCloakDest = @"/usr/local/bin/mousecloak";
NSString *agentDest = [@"/Library/LaunchAgents" stringByAppendingPathComponent: @"com.alexzielenski.mousecloak.listener.plist"];
NSFileManager *manager = [NSFileManager defaultManager];
[self.toggleHelperItem setTag: ([manager fileExistsAtPath:mouseCloakDest] && [manager fileExistsAtPath:agentDest])];
CFDictionaryRef dict = SMJobCopyDictionary(kSMDomainUserLaunchd, CFSTR("com.alexzielenski.mousecloakhelper"));
[self.toggleHelperItem setTag: dict ? 1 : 0];
[self.toggleHelperItem setTitle:self.toggleHelperItem.tag ? @"Uninstall Helper Tool" : @"Install Helper Tool"];
if (dict)
CFRelease(dict);
}
- (IBAction)toggleInstall:(NSMenuItem *)sender {
AuthorizationRef authRef = obtainRights();
BOOL success = NO;
if (authRef == NULL) {
NSLog(@"Failed to obtain authorization right.");
return;
}
NSString *mouseCloakDest = @"/usr/local/bin/mousecloak";
NSString *mouseCloakPath = [[NSBundle mainBundle] pathForAuxiliaryExecutable:@"mousecloak"];
NSString *agentDest = [@"/Library/LaunchAgents" stringByAppendingPathComponent: @"com.alexzielenski.mousecloak.listener.plist"];
NSString *agentPath = [NSTemporaryDirectory() stringByAppendingPathComponent: agentDest.lastPathComponent];
NSString *loadCommand = [NSString stringWithFormat:@"launchctl load %s", agentDest.UTF8String];
NSString *unloadCommand = [NSString stringWithFormat:@"launchctl unload %s", agentDest.UTF8String];
if (self.toggleHelperItem.tag) { // Uninstall
system(unloadCommand.UTF8String);
NSDictionary *removeTools = @{ @"Label": @"com.alexzielenski.mousecloak.remove", @"ProgramArguments": @[ @"/bin/rm", mouseCloakDest, agentDest ], @"RunAtLoad": @YES };
SMJobSubmit(kSMDomainSystemLaunchd, (__bridge CFDictionaryRef)removeTools, authRef, NULL);
SMJobRemove(kSMDomainSystemLaunchd, (__bridge CFStringRef)removeTools[@"Label"], authRef, true, NULL);
if (self.toggleHelperItem.tag != 0) { // Uninstall
success = SMLoginItemSetEnabled(CFSTR("com.alexzielenski.mousecloakhelper"), false);
} else {
NSDictionary *copyTool = @{ @"Label": @"com.alexzielenski.mousecloak.install", @"ProgramArguments": @[ @"/bin/ln", @"-f", @"-s", mouseCloakPath, mouseCloakDest ], @"RunAtLoad": @YES };
SMJobSubmit(kSMDomainSystemLaunchd, (__bridge CFDictionaryRef)copyTool, authRef, NULL);
SMJobRemove(kSMDomainSystemLaunchd, (__bridge CFStringRef)copyTool[@"Label"], authRef, true, NULL);
NSDictionary *launchAgent = @{ @"Label": @"com.alexzielenski.mousecloak.listener", @"ProgramArguments": @[ mouseCloakDest, @"--listen" ], @"LimitLoadToSessionType": @[ @"Aqua" ], @"RunAtLoad": @YES, @"KeepAlive": @YES };
[[NSFileManager defaultManager] removeItemAtPath:agentPath error:nil];
[launchAgent writeToFile:agentPath atomically:NO];
NSDictionary *copyJob = @{ @"Label": @"com.alexzielenski.mousecloak.install2", @"ProgramArguments": @[ @"/bin/cp", @"-f", agentPath, agentDest ], @"RunAtLoad": @YES };
SMJobSubmit(kSMDomainSystemLaunchd, (__bridge CFDictionaryRef)copyJob, authRef, NULL);
SMJobRemove(kSMDomainSystemLaunchd, (__bridge CFStringRef)copyJob[@"Label"], authRef, true, NULL);
system(loadCommand.UTF8String);
success = SMLoginItemSetEnabled(CFSTR("com.alexzielenski.mousecloakhelper"), true);
}
// ServiceManagement.framework takes a while to actually register the job dictionary so if the return value is all good we
// can be on our merry way
if (success && self.toggleHelperItem.tag == 0) {
// Successfully Installed
[self.toggleHelperItem setTag: 1];
[self.toggleHelperItem setTitle:@"Uninstall Helper Tool"];
NSRunAlertPanel(@"Sucess", @"The Mousecape helper was successfully installed", @"Sweet", @"Thanks", nil);
} else if (success) {
// Successfully Uninstalled
[self.toggleHelperItem setTag: 0];
[self.toggleHelperItem setTitle:@"Install Helper Tool"];
NSRunAlertPanel(@"Sucess", @"The Mousecape helper was successfully uninstalled", @"Sweet", @"Thanks", nil);
} else {
NSRunAlertPanel(@"Failure", @"The action did not complete successfully", @"Fuck", nil, nil);
}
AuthorizationFree(authRef, kAuthorizationFlagDestroyRights);
[self configureHelperToolMenuItem];
}
- (MASPreferencesWindowController *)preferencesWindowController {
@@ -154,26 +139,3 @@ static AuthorizationRef obtainRights();
}
@end
static AuthorizationRef obtainRights() {
AuthorizationRef authRef = NULL;
// Creating auth item to bless helper tool and install framework
AuthorizationItem authItem = {kSMRightBlessPrivilegedHelper, 0, NULL, 0};
AuthorizationItem modify = {kSMRightModifySystemDaemons, 0, NULL, 0};
AuthorizationItem items[2] = { authItem, modify };
// Creating a set of authorization rights
AuthorizationRights authRights = {2, items};
// Specifying authorization options for authorization
AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagExtendRights;
// Open dialog and prompt user for password
OSStatus status = AuthorizationCreate(&authRights, kAuthorizationEmptyEnvironment, flags, &authRef);
if (status == errAuthorizationSuccess)
return authRef;
return NULL;
}
+2 -2
View File
@@ -36,11 +36,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.0.2</string>
<string>0.0.3</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1083</string>
<string>1329</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
+10 -17
View File
@@ -1,29 +1,22 @@
{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf200
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\paperw9840\paperh8400
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
\vieww9600\viewh8400\viewkind0
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
\f0\b\fs24 \cf0 Engineering:
\b0 \
Some people\
\
\b Human Interface Design:
\b0 \
Some other people\
Alex Zielenski\
{\field{\*\fldinst{HYPERLINK "http://alexzielenski.com"}}{\fldrslt http://alexzielenski.com}}\
\
\b Testing:
\b0 \
Hopefully not nobody\
\
\b Documentation:
\b0 \
Whoever\
Justin Ayles\
\
\b With special thanks to:
\b0 \
Mom\
}
{\field{\*\fldinst{HYPERLINK "http://maxrudberg.com"}}{\fldrslt Max Rudberg}}\
Mom & Dad\
}
@@ -0,0 +1,16 @@
//
// DTScrollView.h
// iCatalogEditor
//
// Created by Oliver Drobnik on 10/23/12.
// Copyright (c) 2012 Cocoanetics. All rights reserved.
//
#import "RBLScrollView.h"
/**
A scroll view that forwards scroll events up the responder chain if scrolling is along an axis that no scroll bar is shown for. This is useful to have a horizontal scroll view contained in a vertical one. To enable, set usesPredominantAxisScrolling to YES and hide the scroll bar for the axis you don't want to support.
*/
@interface DTScrollView : RBLScrollView
@end
@@ -0,0 +1,33 @@
//
// DTScrollView.m
// iCatalogEditor
//
// Created by Oliver Drobnik on 10/23/12.
// Copyright (c) 2012 Cocoanetics. All rights reserved.
//
#import "DTScrollView.h"
@implementation DTScrollView
- (void)scrollWheel:(NSEvent *)theEvent {
BOOL shouldForwardScroll = NO;
if (self.usesPredominantAxisScrolling) {
if (fabs(theEvent.deltaX) < fabs(theEvent.deltaY)) {
// vertical scroll
if (!self.hasVerticalScroller) {
shouldForwardScroll = YES;
}
}
}
if (shouldForwardScroll) {
[[self nextResponder] scrollWheel:theEvent];
} else {
[super scrollWheel:theEvent];
}
}
@end
@@ -1,32 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
<data>
<int key="IBDocument.SystemTarget">1080</int>
<string key="IBDocument.SystemVersion">12E55</string>
<string key="IBDocument.InterfaceBuilderVersion">3084</string>
<string key="IBDocument.AppKitVersion">1187.39</string>
<string key="IBDocument.HIToolboxVersion">626.00</string>
<int key="IBDocument.SystemTarget">1090</int>
<string key="IBDocument.SystemVersion">14A261i</string>
<string key="IBDocument.InterfaceBuilderVersion">6154.17</string>
<string key="IBDocument.AppKitVersion">1321.11</string>
<string key="IBDocument.HIToolboxVersion">737.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">3084</string>
<string key="NS.object.0">6154.17</string>
</object>
<object class="NSArray" key="IBDocument.IntegratedClassDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
<array key="IBDocument.IntegratedClassDependencies">
<string>NSCustomObject</string>
<string>NSToolbar</string>
<string>NSView</string>
<string>NSWindowTemplate</string>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
</array>
<array key="IBDocument.PluginDependencies">
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</object>
</array>
<object class="NSMutableDictionary" key="IBDocument.Metadata">
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
<integer value="1" key="NS.object.0"/>
</object>
<object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<bool key="EncodedWithXMLCoder">YES</bool>
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<object class="NSCustomObject" id="1001">
<string key="NSClassName">MASPreferencesWindowController</string>
</object>
@@ -42,11 +39,9 @@
<string key="NSWindowRect">{{540, 400}, {360, 270}}</string>
<int key="NSWTFlags">1618478080</int>
<string key="NSWindowTitle"/>
<string key="NSWindowClass">NSWindow</string>
<string key="NSWindowClass">NSPanel</string>
<object class="NSToolbar" key="NSViewClass" id="693562270">
<object class="NSMutableString" key="NSToolbarIdentifier">
<characters key="NS.bytes">A3419266-C6CB-4FAA-AB63-B91B70C196EA</characters>
</object>
<string key="NSToolbarIdentifier">45E11247-C0D1-4D0A-A5E9-F1307B14CEF7</string>
<nil key="NSToolbarDelegate"/>
<bool key="NSToolbarPrefersToBeShown">YES</bool>
<bool key="NSToolbarShowsBaselineSeparator">YES</bool>
@@ -54,14 +49,8 @@
<bool key="NSToolbarAutosavesConfiguration">NO</bool>
<int key="NSToolbarDisplayMode">1</int>
<int key="NSToolbarSizeMode">1</int>
<object class="NSMutableDictionary" key="NSToolbarIBIdentifiedItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys" id="0">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<reference key="dict.values" ref="0"/>
</object>
<reference key="NSToolbarIBAllowedItems" ref="0"/>
<dictionary class="NSMutableDictionary" key="NSToolbarIBIdentifiedItems"/>
<array key="NSToolbarIBAllowedItems" id="0"/>
<reference key="NSToolbarIBDefaultItems" ref="0"/>
<reference key="NSToolbarIBSelectableItems" ref="0"/>
</object>
@@ -74,15 +63,14 @@
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
</object>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
<string key="NSScreenRect">{{0, 0}, {2560, 1417}}</string>
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
<string key="NSFrameAutosaveName"/>
<bool key="NSWindowIsRestorable">YES</bool>
</object>
</object>
</array>
<object class="IBObjectContainer" key="IBDocument.Objects">
<object class="NSMutableArray" key="connectionRecords">
<bool key="EncodedWithXMLCoder">YES</bool>
<array class="NSMutableArray" key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">window</string>
@@ -115,10 +103,9 @@
</object>
<int key="connectionID">22</int>
</object>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
<bool key="EncodedWithXMLCoder">YES</bool>
<array key="orderedObjects">
<object class="IBObjectRecord">
<int key="objectID">0</int>
<reference key="object" ref="0"/>
@@ -146,11 +133,10 @@
<object class="IBObjectRecord">
<int key="objectID">1</int>
<reference key="object" ref="1005"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<array class="NSMutableArray" key="children">
<reference ref="1006"/>
<reference ref="693562270"/>
</object>
</array>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
@@ -161,106 +147,123 @@
<object class="IBObjectRecord">
<int key="objectID">4</int>
<reference key="object" ref="693562270"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<reference key="parent" ref="1005"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>-1.IBPluginDependency</string>
<string>-2.IBPluginDependency</string>
<string>-3.IBPluginDependency</string>
<string>1.IBNSWindowAutoPositionCentersHorizontal</string>
<string>1.IBNSWindowAutoPositionCentersVertical</string>
<string>1.IBPluginDependency</string>
<string>1.IBWindowTemplateEditedContentRect</string>
<string>1.NSWindowTemplate.visibleAtLaunch</string>
<string>2.IBPluginDependency</string>
<string>4.IBPluginDependency</string>
</object>
<object class="NSArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="NO"/>
<boolean value="NO"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{484, 402}, {360, 270}}</string>
<boolean value="NO"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</object>
</object>
<object class="NSMutableDictionary" key="unlocalizedProperties">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference key="dict.sortedKeys" ref="0"/>
<reference key="dict.values" ref="0"/>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="NO" key="1.IBNSWindowAutoPositionCentersHorizontal"/>
<boolean value="NO" key="1.IBNSWindowAutoPositionCentersVertical"/>
<string key="1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="1.IBWindowTemplateEditedContentRect">{{484, 402}, {360, 270}}</string>
<boolean value="NO" key="1.NSWindowTemplate.visibleAtLaunch"/>
<string key="2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="4.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
<nil key="activeLocalization"/>
<object class="NSMutableDictionary" key="localizations">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference key="dict.sortedKeys" ref="0"/>
<reference key="dict.values" ref="0"/>
</object>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">23</int>
<int key="maxID">27</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
<bool key="EncodedWithXMLCoder">YES</bool>
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="IBPartialClassDescription">
<string key="className">FirstResponder</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBUserSource</string>
<string key="minorKey"/>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">MASPreferencesWindowController</string>
<string key="superclassName">NSWindowController</string>
<object class="NSMutableDictionary" key="actions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>goNextTab:</string>
<string>goPreviousTab:</string>
<dictionary class="NSMutableDictionary" key="actions">
<string key="goNextTab:">id</string>
<string key="goPreviousTab:">id</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName">
<object class="IBActionInfo" key="goNextTab:" id="26850041">
<string key="name">goNextTab:</string>
<string key="candidateClassName">id</string>
</object>
<object class="NSArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>id</string>
<string>id</string>
<object class="IBActionInfo" key="goPreviousTab:" id="235845889">
<string key="name">goPreviousTab:</string>
<string key="candidateClassName">id</string>
</object>
</dictionary>
<object class="NSMutableDictionary" key="outlets">
<string key="NS.key.0">toolbar</string>
<string key="NS.object.0">NSToolbar</string>
</object>
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
<string key="NS.key.0">toolbar</string>
<object class="IBToOneOutletInfo" key="NS.object.0" id="206441091">
<string key="name">toolbar</string>
<string key="candidateClassName">NSToolbar</string>
</object>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>goNextTab:</string>
<string>goPreviousTab:</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">../Mousecape/external/MASPreferences/MASPreferencesWindowController.h</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">MASPreferencesWindowController</string>
<dictionary class="NSMutableDictionary" key="actions">
<string key="goNextTab:">id</string>
<string key="goPreviousTab:">id</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName">
<object class="IBActionInfo" key="goNextTab:">
<string key="name">goNextTab:</string>
<string key="candidateClassName">id</string>
</object>
<object class="NSArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBActionInfo">
<string key="name">goNextTab:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">goPreviousTab:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo" key="goPreviousTab:">
<string key="name">goPreviousTab:</string>
<string key="candidateClassName">id</string>
</object>
</dictionary>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">../Mousecape/external/MASPreferences/MASPreferencesWindowController.m</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">MASPreferencesWindowController</string>
<string key="superclassName">NSWindowController</string>
<dictionary class="NSMutableDictionary" key="actions">
<string key="goNextTab:">id</string>
<string key="goPreviousTab:">id</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName">
<reference key="goNextTab:" ref="26850041"/>
<reference key="goPreviousTab:" ref="235845889"/>
</dictionary>
<object class="NSMutableDictionary" key="outlets">
<string key="NS.key.0">toolbar</string>
<string key="NS.object.0">NSToolbar</string>
</object>
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
<string key="NS.key.0">toolbar</string>
<reference key="NS.object.0" ref="206441091"/>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">./Classes/MASPreferencesWindowController.h</string>
</object>
</object>
</object>
</array>
</object>
<int key="IBDocument.localizationMode">0</int>
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
<bool key="IBDocument.previouslyAttemptedUpgradeToXcode5">NO</bool>
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
<integer value="3000" key="NS.object.0"/>
<integer value="4600" key="NS.object.0"/>
</object>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
@@ -0,0 +1,25 @@
//
// NSColor+RBLCGColorAdditions.h
// Rebel
//
// Created by Justin Spahr-Summers on 01.12.11.
// Copyright (c) 2012 GitHub. All rights reserved.
//
// Portions copyright (c) 2011 Bitswift. All rights reserved.
// See the LICENSE file for more information.
//
#import <AppKit/AppKit.h>
// Extensions to NSColor for interoperability with CGColor.
@interface NSColor (RBLCGColorAdditions)
// The CGColor corresponding to the receiver.
@property (nonatomic, readonly) CGColorRef rbl_CGColor;
// Returns an NSColor corresponding to the given CGColor.
//
// This currently does not handle pattern colors.
+ (NSColor *)rbl_colorWithCGColor:(CGColorRef)color;
@end
@@ -0,0 +1,92 @@
//
// NSColor+RBLCGColorAdditions.m
// Rebel
//
// Created by Justin Spahr-Summers on 01.12.11.
// Copyright (c) 2012 GitHub. All rights reserved.
//
// Portions copyright (c) 2011 Bitswift. All rights reserved.
// See the LICENSE file for more information.
//
#import "NSColor+RBLCGColorAdditions.h"
static void drawCGImagePattern (void *info, CGContextRef context) {
CGImageRef image = info;
size_t width = CGImageGetWidth(image);
size_t height = CGImageGetHeight(image);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
}
static void releasePatternInfo (void *info) {
CFRelease(info);
}
@implementation NSColor (RBLCGColorAdditions)
+ (NSColor *)rbl_colorWithCGColor:(CGColorRef)color {
if (color == nil) {
return nil;
}
CGColorSpaceRef colorSpaceRef = CGColorGetColorSpace(color);
NSColorSpace *colorSpace = [[NSColorSpace alloc] initWithCGColorSpace:colorSpaceRef];
NSColor *result = [self colorWithColorSpace:colorSpace components:CGColorGetComponents(color) count:(size_t)CGColorGetNumberOfComponents(color)];
[colorSpace release];
return result;
}
- (CGColorRef)rbl_CGColor {
if ([self.colorSpaceName isEqualToString:NSPatternColorSpace]) {
CGImageRef patternImage = [self.patternImage CGImageForProposedRect:NULL context:nil hints:nil];
if (patternImage == NULL) {
return NULL;
}
size_t width = CGImageGetWidth(patternImage);
size_t height = CGImageGetHeight(patternImage);
CGRect patternBounds = CGRectMake(0, 0, width, height);
CGPatternRef pattern = CGPatternCreate(
// Released in releasePatternInfo().
(void *)CFRetain(patternImage),
patternBounds,
CGAffineTransformIdentity,
width,
height,
kCGPatternTilingConstantSpacingMinimalDistortion,
YES,
&(CGPatternCallbacks){
.version = 0,
.drawPattern = &drawCGImagePattern,
.releaseInfo = &releasePatternInfo
}
);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreatePattern(NULL);
CGColorRef result = CGColorCreateWithPattern(colorSpaceRef, pattern, (CGFloat[]){ 1.0 });
CGColorSpaceRelease(colorSpaceRef);
CGPatternRelease(pattern);
return (CGColorRef)[(id)result autorelease];
}
NSColorSpace *colorSpace = NSColorSpace.genericRGBColorSpace;
NSColor *color = [self colorUsingColorSpace:colorSpace];
CGFloat components[color.numberOfComponents];
[color getComponents:components];
CGColorSpaceRef colorSpaceRef = colorSpace.CGColorSpace;
CGColorRef result = CGColorCreate(colorSpaceRef, components);
return (CGColorRef)[(id)result autorelease];
}
@end
+27
View File
@@ -0,0 +1,27 @@
//
// RBLClipView.h
// Rebel
//
// Created by Justin Spahr-Summers on 2012-09-14.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import <QuartzCore/QuartzCore.h>
// A faster NSClipView based on CAScrollLayer.
//
// This view should be set as the scroll view's contentView as soon as possible
// after the scroll view is initialized. For some reason, scroll bars will
// disappear on 10.7 (but not 10.8) unless hasHorizontalScroller and
// hasVerticalScroller are set _after_ the contentView.
@interface RBLClipView : NSClipView
// The backing layer for this view.
@property (nonatomic, strong) CAScrollLayer *layer;
// Whether the content in this view is opaque.
//
// Defaults to NO.
@property (nonatomic, getter = isOpaque) BOOL opaque;
@end
+52
View File
@@ -0,0 +1,52 @@
//
// RBLClipView.m
// Rebel
//
// Created by Justin Spahr-Summers on 2012-09-14.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import "RBLClipView.h"
#import "NSColor+RBLCGColorAdditions.h"
@implementation RBLClipView
#pragma mark Properties
@dynamic layer;
- (NSColor *)backgroundColor {
return [NSColor rbl_colorWithCGColor:self.layer.backgroundColor];
}
- (void)setBackgroundColor:(NSColor *)color {
self.layer.backgroundColor = color.rbl_CGColor;
}
- (BOOL)isOpaque {
return self.layer.opaque;
}
- (void)setOpaque:(BOOL)opaque {
self.layer.opaque = opaque;
}
#pragma mark Lifecycle
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self == nil) return nil;
self.layer = [CAScrollLayer layer];
self.wantsLayer = YES;
self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawNever;
// Matches default NSClipView settings.
self.backgroundColor = NSColor.clearColor;
self.opaque = NO;
return self;
}
@end
+17
View File
@@ -0,0 +1,17 @@
//
// RBLScrollView.h
// Rebel
//
// Created by Jonathan Willing on 12/4/12.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import <Cocoa/Cocoa.h>
// A NSScrollView subclass which uses an instance of RBLClipView
// as the clip view instead of NSClipView.
//
// Layer-backed by default.
@interface RBLScrollView : NSScrollView
@end
+43
View File
@@ -0,0 +1,43 @@
//
// RBLScrollView.m
// Rebel
//
// Created by Jonathan Willing on 12/4/12.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import "RBLScrollView.h"
#import "RBLClipView.h"
@implementation RBLScrollView
#pragma mark Lifecycle
- (id)initWithFrame:(NSRect)frameRect {
self = [super initWithFrame:frameRect];
if (self == nil) return nil;
[self swapClipView];
return self;
}
- (void)awakeFromNib {
[super awakeFromNib];
if (![self.contentView isKindOfClass:RBLClipView.class] ) {
[self swapClipView];
}
}
#pragma mark Clip view swapping
- (void)swapClipView {
self.wantsLayer = YES;
id documentView = self.documentView;
RBLClipView *clipView = [[RBLClipView alloc] initWithFrame:self.contentView.frame];
self.contentView = clipView;
self.documentView = documentView;
}
@end
@@ -28,11 +28,6 @@
self.rep500View.scale = 5.0;
self.rep1000View.scale = 10.0;
self.rep100View.shouldShowHotSpot = YES;
self.rep200View.shouldShowHotSpot = YES;
self.rep500View.shouldShowHotSpot = YES;
self.rep1000View.shouldShowHotSpot = YES;
[self.rep100View bind:@"image" toObject:self withKeyPath:@"cursor.cursorImage100" options:nil];
[self.rep100View bind:@"frameCount" toObject:self withKeyPath:@"cursor.frameCount" options:nil];
[self.rep100View bind:@"frameDuration" toObject:self withKeyPath:@"cursor.frameDuration" options:nil];
@@ -99,3 +94,4 @@
}
@end
@@ -56,7 +56,7 @@
[self.editListController addObserver:self forKeyPath:@"selectedObject" options:0 context:nil];
[self _setCurrentViewController:self.editCapeController];
[self.window bind:@"documentEdited" toObject:self withKeyPath:@"cursorLibrary.isDirty" options:nil];
[self.window bind:@"documentEdited" toObject:self withKeyPath:@"cursorLibrary.dirty" options:nil];
}
- (void)dealloc {
@@ -46,6 +46,10 @@ const char MCLibraryIdentifierContext;
NSString *applied = [NSUserDefaults.standardUserDefaults stringForKey:MCPreferencesAppliedCursorKey];
for (NSString *filename in contents) {
// Ignore hidden files like .DS_Store
if ([filename hasPrefix:@"."])
continue;
NSURL *fileURL = [NSURL fileURLWithPathComponents:@[ capesPath, filename ]];
MCCursorLibrary *library = [MCCursorLibrary cursorLibraryWithContentsOfURL:fileURL];
@@ -65,7 +65,7 @@
#pragma mark - Menu Actions
- (IBAction)applyCape:(NSMenuItem *)sender {
- (IBAction)applyCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
@@ -75,7 +75,7 @@
[self.libraryViewController.libraryController applyCape:cape];
}
- (IBAction)editCape:(NSMenuItem *)sender {
- (IBAction)editCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
@@ -85,7 +85,7 @@
[self.libraryViewController editCape:cape];
}
- (IBAction)removeCape:(NSMenuItem *)sender {
- (IBAction)removeCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
@@ -100,7 +100,7 @@
}
}
- (IBAction)duplicateCape:(NSMenuItem *)sender {
- (IBAction)duplicateCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
@@ -110,11 +110,11 @@
[self.libraryViewController.libraryController importCape:cape.copy];
}
- (IBAction)checkCape:(NSMenuItem *)sender {
- (IBAction)checkCapeAction:(NSMenuItem *)sender {
}
- (IBAction)showCape:(NSMenuItem *)sender {
- (IBAction)showCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4514" systemVersion="13C48" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6154.17" systemVersion="14A261i" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment version="1070" defaultVersion="1080" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/>
<deployment version="1070" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6154.17"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MCGeneralPreferencesController">
@@ -18,7 +18,6 @@
<subviews>
<slider verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="JRx-YT-ae7">
<rect key="frame" x="18" y="19" width="392" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<sliderCell key="cell" continuous="YES" state="on" alignment="left" minValue="1" maxValue="16" doubleValue="1" tickMarkPosition="below" numberOfTickMarks="16" sliderType="linear" id="osm-63-Q66"/>
<connections>
<binding destination="-2" name="value" keyPath="cursorScale" id="PlF-RW-V9z"/>
@@ -26,7 +25,6 @@
</slider>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hg4-8F-fVE">
<rect key="frame" x="20" y="52" width="82" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Cursor Scale" id="gxo-nh-UCg">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -35,7 +33,6 @@
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="yjb-oM-v3t">
<rect key="frame" x="18" y="81" width="265" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Double Clicks capes" id="mFs-6l-Guo">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -44,8 +41,7 @@
</textField>
<segmentedControl verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZYi-xB-wBd">
<rect key="frame" x="119" y="75" width="111" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<segmentedCell key="cell" alignment="left" style="texturedSquare" trackingMode="selectOne" id="oXj-Hj-PSJ">
<segmentedCell key="cell" borderStyle="border" alignment="left" style="texturedSquare" trackingMode="selectOne" id="oXj-Hj-PSJ">
<font key="font" metaFont="system"/>
<segments>
<segment label="apply" width="54"/>
@@ -55,25 +51,20 @@
<connections>
<binding destination="Dw0-Gt-5ak" name="selectedIndex" keyPath="values.MCDoubleAction" id="GuD-im-CgM">
<dictionary key="options">
<integer key="NSNotApplicablePlaceholder" value="0"/>
<integer key="NSNoSelectionPlaceholder" value="0"/>
<integer key="NSNullPlaceholder" value="0"/>
<integer key="NSMultipleValuesPlaceholder" value="0"/>
<integer key="NSNoSelectionPlaceholder" value="0"/>
<integer key="NSNotApplicablePlaceholder" value="0"/>
<integer key="NSNullPlaceholder" value="0"/>
</dictionary>
</binding>
</connections>
</segmentedControl>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="QBy-dj-wZ4">
<rect key="frame" x="416" y="25" width="44" height="19"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="nlB-rR-gpk">
<numberFormatter key="formatter" formatterBehavior="custom10_4" positiveFormat="#0.00" negativeFormat="#0.00" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="1" maximumIntegerDigits="2" minimumFractionDigits="2" maximumFractionDigits="2" id="ZjS-1g-txf">
<real key="roundingIncrement" value="0.0"/>
<numberFormatter key="formatter" formatterBehavior="custom10_4" positiveFormat="#0.00" negativeFormat="#0.00" usesGroupingSeparator="NO" paddingCharacter="*" groupingSize="0" minimumIntegerDigits="1" maximumIntegerDigits="2" minimumFractionDigits="2" maximumFractionDigits="2" decimalSeparator="." groupingSeparator="," currencyDecimalSeparator="." plusSign="+" minusSign="-" notANumberSymbol="NaN" perMillSymbol="‰" percentSymbol="%" exponentSymbol="E" positivePrefix="" positiveSuffix="" negativePrefix="-" negativeSuffix="" id="ZjS-1g-txf">
<real key="minimum" value="0.5"/>
<real key="maximum" value="16"/>
<metadata>
<bool key="localizesFormat" value="YES"/>
</metadata>
</numberFormatter>
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -87,4 +78,4 @@
</customView>
<userDefaultsController representsSharedInstance="YES" id="Dw0-Gt-5ak"/>
</objects>
</document>
</document>
+1 -2
View File
@@ -190,7 +190,7 @@ MCCursorScale cursorScaleForScale(CGFloat scale) {
}
- (void)removeRepresentationForScale:(MCCursorScale)scale {
[self setRepresentation:Nil forScale:scale];
[self setRepresentation:nil forScale:scale];
}
- (NSImageRep *)representationForScale:(MCCursorScale)scale {
@@ -203,7 +203,6 @@ MCCursorScale cursorScaleForScale(CGFloat scale) {
- (NSImage *)imageWithAllReps {
NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(self.size.width, self.size.height * self.frameCount)];
image.matchesOnMultipleResolution = YES;
[image addRepresentations:self.representations.allValues];
return image;
}
@@ -18,7 +18,7 @@
@property (nonatomic, copy) NSURL *fileURL;
@property (nonatomic, weak) MCLibraryController *library;
@property (nonatomic, readonly) NSUndoManager *undoManager;
@property (nonatomic, readonly) BOOL isDirty;
@property (nonatomic, readonly, getter=isDirty) BOOL dirty;
@property (nonatomic, assign, getter = isInCloud) BOOL inCloud;
@property (nonatomic, assign, getter = isHiDPI) BOOL hiDPI;
@@ -13,6 +13,7 @@
@property (nonatomic, readwrite, strong) NSMutableSet *cursors;
@property (nonatomic, assign) NSUInteger changeCount;
@property (nonatomic, assign) NSUInteger lastChangeCount;
@property (nonatomic, strong) NSArray *observers;
- (BOOL)_readFromDictionary:(NSDictionary *)dictionary;
- (void)addCursorsFromDictionary:(NSDictionary *)cursorDicts ofVersion:(CGFloat)doubleVersion;
@@ -28,7 +29,7 @@
@end
@implementation MCCursorLibrary
@dynamic isDirty;
@dynamic dirty;
+ (NSArray *)undoProperties {
return @[ @"identifier", @"name", @"author", @"hiDPI", @"version", @"inCloud" ];
@@ -88,18 +89,20 @@
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
__weak typeof(self) weakSelf = self;
[center addObserverForName:NSUndoManagerDidCloseUndoGroupNotification object:self.undoManager queue:nil usingBlock:^(NSNotification *note) {
id ob1 = [center addObserverForName:NSUndoManagerDidCloseUndoGroupNotification object:self.undoManager queue:nil usingBlock:^(NSNotification *note) {
[weakSelf updateChangeCount:NSChangeDone];
}];
[center addObserverForName:NSUndoManagerDidUndoChangeNotification object:self.undoManager queue:nil usingBlock:^(NSNotification *note) {
id ob2 = [center addObserverForName:NSUndoManagerDidUndoChangeNotification object:self.undoManager queue:nil usingBlock:^(NSNotification *note) {
[weakSelf updateChangeCount:NSChangeUndone];
}];
[center addObserverForName:NSUndoManagerDidRedoChangeNotification object:self.undoManager queue:nil usingBlock:^(NSNotification *note) {
id ob3 = [center addObserverForName:NSUndoManagerDidRedoChangeNotification object:self.undoManager queue:nil usingBlock:^(NSNotification *note) {
[weakSelf updateChangeCount:NSChangeRedone];
}];
self.observers = @[ob1, ob2, ob3];
self.name = @"Unnamed";
self.author = NSUserName();
self.hiDPI = NO;
@@ -132,7 +135,7 @@
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"isDirty"]) {
if ([key isEqualToString:@"dirty"]) {
keyPaths = [keyPaths setByAddingObjectsFromArray: @[@"changeCount", @"lastChangeCount"]];
}
return keyPaths;
@@ -193,6 +196,10 @@
for (MCCursor *cursor in self.cursors) {
[self stopObservingCursor:cursor];
}
for (id observer in self.observers) {
[NSNotificationCenter.defaultCenter removeObserver:observer];
}
}
const char MCCursorLibraryPropertiesContext;
@@ -33,9 +33,9 @@
return YES;
}
*error = [NSError errorWithDomain:MCErrorDomain code:MCErrorInvalidFormatCode userInfo:@{
*error = [[NSError errorWithDomain:MCErrorDomain code:MCErrorInvalidFormatCode userInfo:@{
NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid format", @"Invalid format error description in edit window"),
NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Must follow format of: \"{0.0, 0.0}\"." , @"Invalid format error reason in edit window")}];
NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Must follow format of: \"{0.0, 0.0}\"." , @"Invalid format error reason in edit window")}] localizedDescription];
return NO;
}
@@ -66,9 +66,9 @@
return YES;
}
*error = [NSError errorWithDomain:MCErrorDomain code:MCErrorInvalidFormatCode userInfo:@{
*error = [[NSError errorWithDomain:MCErrorDomain code:MCErrorInvalidFormatCode userInfo:@{
NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid format", @"Invalid format error description in edit window"),
NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Must follow format of: \"{0.0, 0.0}\"." , @"Invalid format error reason in edit window")}];
NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Must follow format of: \"{0.0, 0.0}\"." , @"Invalid format error reason in edit window")}] localizedDescription];
return NO;
}
@@ -7,12 +7,16 @@
//
#import <Cocoa/Cocoa.h>
#import "MMAnimatingImageView.h"
@interface MCCapeCellView : NSTableCellView
@property (assign) IBOutlet NSTextField *titleField;
@property (assign) IBOutlet NSTextField *subtitleField;
@property (assign) IBOutlet NSImageView *appliedImageView;
@property IBOutlet NSTextField *titleField;
@property IBOutlet NSTextField *subtitleField;
@property IBOutlet NSImageView *appliedImageView;
@property IBOutlet NSImageView *resolutionImageView;
@property IBOutlet NSCollectionView *collectionView;
@end
@interface MCHDValueTransformer : NSValueTransformer
@end
@end
+18 -8
View File
@@ -7,13 +7,20 @@
//
#import "MCCapeCellView.h"
#import "MCCapePreviewItem.h"
@implementation MCCapeCellView
- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle {
[super setBackgroundStyle:backgroundStyle];
//
- (void)viewDidMoveToWindow {
self.collectionView.itemPrototype = [MCCapePreviewItem new];
[self.collectionView bind:NSContentBinding toObject:self withKeyPath:@"objectValue.cursors" options:nil];
self.collectionView.minItemSize = self.collectionView.itemPrototype.view.frame.size;
self.collectionView.maxItemSize = self.collectionView.minItemSize;
}
- (void)dealloc {
[self.collectionView unbind:NSContentBinding];
}
@end
@@ -21,13 +28,16 @@
@implementation MCHDValueTransformer
+ (Class)transformedValueClass {
return [NSString class];
return [NSImage class];
}
- (NSString *)transformedValue:(NSNumber *)value {
- (NSImage *)transformedValue:(NSNumber *)value {
BOOL isHiDPI = value.boolValue;
return isHiDPI ? [NSImage imageNamed:@"HDTemplate"] : [NSImage imageNamed:@"SDTemplate"];
NSImage *image = isHiDPI ? [NSImage imageNamed:@"HDTemplate"] : [NSImage imageNamed:@"SDTemplate"];
image.template = YES;
return image;
}
@end
@@ -0,0 +1,14 @@
//
// MCCapePreviewItem.h
// Mousecape
//
// Created by Alex Zielenski on 3/10/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "MMAnimatingImageView.h"
@interface MCCapePreviewItem : NSCollectionViewItem
@property (nonatomic, assign) IBOutlet MMAnimatingImageView *animatingImageView;
@end
@@ -0,0 +1,41 @@
//
// MCCapePreviewItem.m
// Mousecape
//
// Created by Alex Zielenski on 3/10/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import "MCCapePreviewItem.h"
@interface MCCapePreviewItem ()
@end
@implementation MCCapePreviewItem
- (id)init {
if ((self = [super init])) {
self.view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 40, 40)];
MMAnimatingImageView *im = [[MMAnimatingImageView alloc] initWithFrame:self.view.frame];
self.animatingImageView = im;
self.animatingImageView.shouldAllowDragging = NO;
[self.view addSubview:im];
[self.animatingImageView bind:@"image" toObject:self withKeyPath:@"representedObject.imageWithAllReps" options:nil];
[self.animatingImageView bind:@"frameCount" toObject:self withKeyPath:@"representedObject.frameCount" options:nil];
[self.animatingImageView bind:@"frameDuration" toObject:self withKeyPath:@"representedObject.frameDuration" options:nil];
}
return self;
}
- (void)dealloc {
[self.animatingImageView unbind:@"image"];
[self.animatingImageView unbind:@"frameCount"];
[self.animatingImageView unbind:@"frameDuration"];
}
@end
@@ -36,4 +36,5 @@
@property (weak) IBOutlet id <MMAnimatingImageViewDelegate> delegate;
@property (assign) BOOL shouldAnimate;
@property (assign) BOOL shouldShowHotSpot;
@property (assign) BOOL shouldAllowDragging;
@end
@@ -18,6 +18,7 @@ const char MCInvalidateContext;
- (void)_invalidateFrame;
- (void)_invalidateAnimation;
- (void)registerTypes;
- (void)_dragAnimationEnded:(id)sender;
@end
@implementation MMAnimatingImageView
@@ -47,7 +48,7 @@ const char MCInvalidateContext;
- (void)_initialize {
self.shouldAnimate = YES;
[self registerTypes];
self.layer = [[MCSpriteLayer alloc] init];
@@ -62,11 +63,16 @@ const char MCInvalidateContext;
hotSpotLayer.backgroundColor = [[NSColor redColor] CGColor];
hotSpotLayer.autoresizingMask = kCALayerNotSizable;
hotSpotLayer.anchorPoint = CGPointMake(0, 0);
hotSpotLayer.borderColor = [[NSColor blackColor] CGColor];
hotSpotLayer.borderWidth = 0.5;
[self.layer addSublayer:hotSpotLayer];
self.hotSpotLayer = hotSpotLayer;
self.spriteLayer = (MCSpriteLayer *)self.layer;
self.shouldShowHotSpot = NO;
self.shouldAllowDragging = NO;
self.frameCount = 1;
self.frameDuration = 1;
@@ -90,7 +96,7 @@ const char MCInvalidateContext;
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (context == &MCInvalidateContext) {
if ([keyPath isEqualToString:@"image"] || [keyPath isEqualToString:@"placeholderImage"]) {
self.spriteLayer.contents = !self.image ? self.placeholderImage : self.image;
self.spriteLayer.contents = self.image ?: self.placeholderImage;
}
[self _invalidateFrame];
[self _invalidateAnimation];
@@ -100,7 +106,7 @@ const char MCInvalidateContext;
}
- (BOOL)layer:(CALayer *)layer shouldInheritContentsScale:(CGFloat)newScale fromWindow:(NSWindow *)window {
return self.scale == 0.0 || !self.image;
return NO;
}
// Tell OSX that our view can accept images to be dragged in
@@ -128,13 +134,23 @@ const char MCInvalidateContext;
- (void)_invalidateFrame {
CGFloat scale = self.scale;
if (!self.scale || !self.image)
if (!self.scale || !self.image) {
scale = self.window.backingScaleFactor;
self.layer.contentsScale = scale;
}
if (scale == 0.0)
scale = 1.0;
if (self.scale && self.image)
scale = self.scale;
else if (!self.scale && self.image)
scale = [self.image recommendedLayerContentsScale:self.window.backingScaleFactor];
else
scale = [self.placeholderImage recommendedLayerContentsScale:self.window.backingScaleFactor];
self.layer.contentsScale = scale;
self.spriteLayer.contentsScale = self.layer.contentsScale;
if (self.image) {
CGSize effectiveSize = CGSizeMake(self.image.size.width, self.image.size.height / self.frameCount);
CGRect effectiveRect = CGRectIntegral(CGRectMake(self.layer.frame.size.width / 2.0 - effectiveSize.width / 2.0, self.layer.frame.size.height / 2.0 + effectiveSize.height / 2.0, effectiveSize.width, effectiveSize.height));
@@ -172,7 +188,7 @@ const char MCInvalidateContext;
#pragma mark - NSDraggingSource
- (NSDragOperation)draggingSession:(NSDraggingSession *)session sourceOperationMaskForDraggingContext:(NSDraggingContext)context {
if (context == NSDraggingContextWithinApplication)
if (context == NSDraggingContextWithinApplication && self.shouldAllowDragging)
return NSDragOperationCopy;
return NSDragOperationNone;
}
@@ -180,11 +196,15 @@ const char MCInvalidateContext;
- (void)draggingSession:(NSDraggingSession *)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation {
if (self.delegate && [self.delegate respondsToSelector:@selector(imageView:didDragOutImage:)] && operation == NSDragOperationNone && !NSPointInRect(screenPoint, self.window.frame)) {
[[NSCursor currentCursor] pop];
NSShowAnimationEffect(NSAnimationEffectPoof, screenPoint, NSZeroSize, nil, NULL, nil);
NSShowAnimationEffect(NSAnimationEffectPoof, screenPoint, NSZeroSize, self, @selector(_dragAnimationEnded:), nil);
[self.delegate imageView:self didDragOutImage:self.image];
}
}
- (void)_dragAnimationEnded:(id)sender {
[[NSCursor arrowCursor] push];
}
- (void)draggingSession:(NSDraggingSession *)session movedToPoint:(NSPoint)screenPoint {
if (!NSPointInRect(screenPoint, self.window.frame)) {
[[NSCursor disappearingItemCursor] push];
@@ -198,11 +218,11 @@ const char MCInvalidateContext;
}
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent {
return YES;
return self.shouldAllowDragging;
}
- (void)mouseDown:(NSEvent *)event {
if (!self.image)
if (!self.image || !self.shouldAllowDragging)
return;
NSPasteboardItem *pbItem = [NSPasteboardItem new];
@@ -246,7 +266,8 @@ const char MCInvalidateContext;
// Only thing we have to do here is confirm that the dragged file is an image. We use NSImage's +canInitWithPasteboard: and we also check to see there is only one item being dragged
if ([self.delegate conformsToProtocol:@protocol(MMAnimatingImageViewDelegate)] && // No point in accepting the drop if the delegate doesn't support it/exist
[NSImage canInitWithPasteboard:sender.draggingPasteboard] && // Only Accept Images
sender.draggingPasteboard.pasteboardItems.count == 1) { // Only accept one item
sender.draggingPasteboard.pasteboardItems.count == 1 &&
self.shouldAllowDragging) { // Only accept one item
return [self.delegate imageView:self draggingEntered:sender];
}
return NSDragOperationNone;
@@ -254,7 +275,7 @@ const char MCInvalidateContext;
// Give the delegate some more control
- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender {
if ([self.delegate conformsToProtocol:@protocol(MMAnimatingImageViewDelegate)]) {
if ([self.delegate conformsToProtocol:@protocol(MMAnimatingImageViewDelegate)] && self.shouldAllowDragging) {
return [self.delegate imageView:self shouldPrepareForDragOperation:sender];
}
return NO;
-70
View File
@@ -1,70 +0,0 @@
//
// MousecapeTests.m
// MousecapeTests
//
// Created by Alex Zielenski on 2/1/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <XCTest/XCTest.h>
#import "MCCursorLibrary.h"
@interface MousecapeTests : XCTestCase
@property (strong) MCCursorLibrary *library;
@end
@implementation MousecapeTests
- (void)setUp
{
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
self.library = [MCCursorLibrary cursorLibraryWithContentsOfFile:[@(PROJECT_DIR) stringByAppendingPathComponent: @"com.maxrudberg.svanslosbluehazard.cape"]];
}
- (void)tearDown
{
// Put teardown code here. This method is called after the invocation of each test method in the class.
[super tearDown];
}
- (void)testLibraryCreation {
XCTAssertTrue(self.library != nil, @"Library must not be nil");
XCTAssertEqualObjects(self.library.author, @"Max Rudberg", @"Author must be taken from cape");
XCTAssertEqualObjects(self.library.identifier, @"com.maxrudberg.svanslosbluehazard", @"Identifier must be taken from cape");
XCTAssert([self.library cursorsWithIdentifier:@"com.apple.coregraphics.Arrow"].count > 0, @"Must retrieve cursor correctly");
}
- (void)testCursorCreation {
MCCursor *cursor = [self.library cursorsWithIdentifier:@"com.apple.coregraphics.Arrow"].anyObject;
XCTAssertTrue(cursor.representations.count == 4, @"Must have correct cursor count");
XCTAssertTrue(cursor.frameCount == 1, @"Must have correct frame count");
XCTAssertTrue(cursor.frameDuration == 1, @"Must have current frame duration");
XCTAssertTrue(NSEqualSizes(cursor.size, NSMakeSize(20, 24)), @"Must have correct size");
NSImageRep *smallest = [cursor representationForScale:MCCursorScale100];
XCTAssertTrue(NSEqualSizes(NSMakeSize(smallest.pixelsWide, smallest.pixelsHigh), cursor.size), @"Size must be equal to 1x rep");
}
- (void)testCursorOperations {
MCCursor *cursor = [[self.library cursorsWithIdentifier:@"com.apple.coregraphics.Arrow"] anyObject];
cursor.identifier = @"com.apple.cursor.2";
XCTAssertEqualObjects(cursor.name, nameForCursorIdentifier(@"com.apple.cursor.2"), @"Name must be correctly set");
XCTAssertEqual(cursor, [self.library cursorsWithIdentifier:@"com.apple.cursor.2"].anyObject, @"Object must not be copied");
XCTAssertEqualObjects(cursor, cursor, @"isEqualTo: must work");
XCTAssert([self.library cursorsWithIdentifier:@"com.apple.coregraphics.Arrow"].count == 0, @"Old cursor spot must not be occupied");
MCCursor *replacement = [[MCCursor alloc] init];
replacement.identifier = @"com.apple.cursor.2";
[self.library addCursor:replacement];
XCTAssertEqual(replacement, [self.library cursorsWithIdentifier:@"com.apple.cursor.2"].anyObject, @"Replacement cursor must be retrievable");
}
- (void)testSavingAndReading {
NSDictionary *dictionary = self.library.dictionaryRepresentation;
MCCursorLibrary *read = [MCCursorLibrary cursorLibraryWithDictionary:dictionary];
XCTAssertEqualObjects(self.library, read, @"Saving and reading must result in equal objects");
}
@end
@@ -1,2 +0,0 @@
/* Localized versions of Info.plist keys */
+1 -1
View File
@@ -38,7 +38,7 @@ CG_EXTERN CGError CoreCursorCopyImages(CGSConnectionID cid, CGSCursorID cursorID
#pragma mark - Cursor APIs reversed by Alex Zielenski on Lion 10.7.3
#pragma mark -
CG_EXTERN CGError CGSIsCursorRegistered(CGSConnectionID cid, char *cursorName, bool *registered);
CG_EXTERN CGError CGSIsCursorRegistered(CGSConnectionID cid, char *cursorName, bool *registered) __attribute__((weak_import));
#if defined(MAC_OS_X_VERSION_10_8)
CG_EXTERN CGError CGSCopyRegisteredCursorImages(CGSConnectionID cid, char *cursorName, CGSize *imageSize, CGPoint *hotSpot, NSUInteger *frameCount, CGFloat *frameDuration, CFArrayRef *imageArray);
+4 -1
View File
@@ -69,4 +69,7 @@ extern NSDictionary *capeWithIdentifier(NSString *identifier);
extern void CGImageWriteToFile(CGImageRef image, CFStringRef path);
extern NSData *pngDataForImage(id image);
extern NSString *MMGet();
#endif
extern CGError MCIsCursorRegistered(CGSConnectionID cid, char *cursorName, bool *registered);
#endif
+20 -5
View File
@@ -109,17 +109,18 @@ NSDictionary *capeWithIdentifier(NSString *identifier) {
CFArrayRef representations;
bool registered = false;
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)identifier.UTF8String, &registered);
MCIsCursorRegistered(CGSMainConnectionID(), (char *)identifier.UTF8String, &registered);
if (!registered)
return nil;
CGError error = 0;
if (![identifier hasPrefix:@"com.apple.cursor"]) {
CGSCopyRegisteredCursorImages(CGSMainConnectionID(), (char*)identifier.UTF8String, &size, &hotSpot, &frameCount, &frameDuration, &representations);
error = CGSCopyRegisteredCursorImages(CGSMainConnectionID(), (char*)identifier.UTF8String, &size, &hotSpot, &frameCount, &frameDuration, &representations);
} else {
CoreCursorCopyImages(CGSMainConnectionID(), [[identifier pathExtension] intValue], &representations, &size, &hotSpot, &frameCount, &frameDuration);
error = CoreCursorCopyImages(CGSMainConnectionID(), [[identifier pathExtension] intValue], &representations, &size, &hotSpot, &frameCount, &frameDuration);
}
if (!representations)
if (error || !representations || !CFArrayGetCount(representations))
return nil;
NSDictionary *dict = @{MCCursorDictionaryFrameCountKey: @(frameCount), MCCursorDictionaryFrameDuratiomKey: @(frameDuration), MCCursorDictionaryHotSpotXKey: @(hotSpot.x), MCCursorDictionaryHotSpotYKey: @(hotSpot.y), MCCursorDictionaryPointsWideKey: @(size.width), MCCursorDictionaryPointsHighKey: @(size.height), MCCursorDictionaryRepresentationsKey: (__bridge NSArray *)representations};
@@ -200,3 +201,17 @@ NSString *cursorIdentifierForName(NSString *name) {
return keys[0];
return UUID();
}
extern CGError MCIsCursorRegistered(CGSConnectionID cid, char *cursorName, bool *registered) {
if (CGSIsCursorRegistered != NULL) {
return CGSIsCursorRegistered(cid, cursorName, registered);
}
size_t size = 0;
CGError err = 0;
err = CGSGetRegisteredCursorDataSize(cid, cursorName, &size);
*registered = !((BOOL)err) && size > 0;
return err;
}
+6 -6
View File
@@ -15,16 +15,16 @@ NSString *backupStringForIdentifier(NSString *identifier) {
void backupCursorForIdentifier(NSString *ident) {
bool registered = false;
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)ident.UTF8String, &registered);
MCIsCursorRegistered(CGSMainConnectionID(), (char *)ident.UTF8String, &registered);
// dont try to backup a nonexistant cursor
// dont try to backup a nonexistant cursor
if (!registered)
return;
NSString *backupIdent = backupStringForIdentifier(ident);
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)backupIdent.UTF8String, &registered);
MCIsCursorRegistered(CGSMainConnectionID(), (char *)backupIdent.UTF8String, &registered);
// don't re-back it up
// don't re-back it up
if (registered)
return;
@@ -35,11 +35,11 @@ void backupCursorForIdentifier(NSString *ident) {
void backupAllCursors() {
bool arrowRegistered = false;
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)backupStringForIdentifier(@"com.apple.coregraphics.Arrow").UTF8String, &arrowRegistered);
MCIsCursorRegistered(CGSMainConnectionID(), (char *)backupStringForIdentifier(@"com.apple.coregraphics.Arrow").UTF8String, &arrowRegistered);
if (arrowRegistered) {
MMLog("Skipping backup, backup already exists");
// we are already backed up
// we are already backed up
return;
}
// Backup main cursors first
+3
View File
@@ -12,8 +12,11 @@ extern NSError *createCape(NSString *input, NSString *output, BOOL convert);
extern NSDictionary *processedCapeWithIdentifier(NSString *identifier);
extern void dumpCursorsToFile(NSString *path);
extern void dumpCursorsToFolder(NSString *path);
extern NSDictionary *createCapeFromDirectory(NSString *path);
extern NSDictionary *createCapeFromMightyMouse(NSDictionary *mightyMouse, NSDictionary *metadata);
extern void exportCape(NSDictionary *cape, NSString *destination);
#endif
+55
View File
@@ -300,3 +300,58 @@ void dumpCursorsToFile(NSString *path) {
[cape writeToFile:path atomically:NO];
}
extern void dumpCursorsToFolder(NSString *path) {
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
MMLog("Dumping cursors...");
float originalScale;
CGSGetCursorScale(CGSMainConnectionID(), &originalScale);
CGSSetCursorScale(CGSMainConnectionID(), 16.0);
CGSHideCursor(CGSMainConnectionID());
NSUInteger i = 0;
NSString *key = nil;
while ((key = defaultCursors[i]) != nil) {
MMLog("Gathering data for %s", key.UTF8String);
NSDictionary *cape = processedCapeWithIdentifier(key);
[[cape[MCCursorDictionaryRepresentationsKey] lastObject] writeToFile:[[path stringByAppendingPathComponent:key] stringByAppendingPathExtension:@"png"] atomically: NO];
i++;
}
for (int x = 0x0; x < 0x100; x++) {
NSString *key = [@"com.apple.cursor." stringByAppendingFormat:@"%d", x];
CoreCursorSet(CGSMainConnectionID(), x);
NSDictionary *cape = processedCapeWithIdentifier(key);
if (!cape)
continue;
MMLog("Gathering data for %s", key.UTF8String);
[[cape[MCCursorDictionaryRepresentationsKey] lastObject] writeToFile:[[path stringByAppendingPathComponent:key] stringByAppendingPathExtension:@"png"] atomically:NO];
}
CGSSetCursorScale(CGSMainConnectionID(), originalScale);
CGSShowCursor(CGSMainConnectionID());
}
extern void exportCape(NSDictionary *cape, NSString *destination) {
NSFileManager *manager = [NSFileManager defaultManager];
[manager createDirectoryAtPath:destination withIntermediateDirectories:YES attributes:nil error:nil];
NSDictionary *cursors = cape[MCCursorDictionaryCursorsKey];
for (NSString *key in cursors) {
NSArray *reps = cursors[key][MCCursorDictionaryRepresentationsKey];
for (NSUInteger idx = 0; idx < reps.count; idx++) {
NSData *data = reps[idx];
[data writeToFile:[destination stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_%lu.png", key, (unsigned long)idx]] atomically:NO];
}
}
}
+15 -2
View File
@@ -22,7 +22,7 @@
@end
int main(int argc, char * argv[]) {
@autoreleasepool {
@autoreleasepool {
GBSettings *settings = [GBSettings settingsWithName:@"mousecape" parent:nil];
GBOptionsHelper *options = [[[GBOptionsHelper alloc] init] autorelease];
@@ -57,8 +57,9 @@ int main(int argc, char * argv[]) {
[options registerSeparator:@(BOLD "CONVERTING MIGHTYMOUSE TO CAPE" RESET)];
[options registerOption:'x' long:@"convert" description:@"Convert a .MightyMouse file to cape. Default output is to a new file of the same name" flags:GBValueRequired];
[options registerSeparator:@(BOLD "MISCELLANEOUS" RESET)];
[options registerOption:'e' long:@"export" description:@"Export a cape to a directory" flags:GBValueRequired];
[options registerOption:'?' long:@"help" description:@"Display this help and exit" flags:GBValueNone];
[options registerOption:'o' long:@"output" description:@"Use this option to tell where an output file goes. (For convert and create)" flags:GBValueRequired];
[options registerOption:'o' long:@"output" description:@"Use this option to tell where an output file goes. (For convert, create, and export)" flags:GBValueRequired];
[options registerOption:0 long:@"suppressCopyright" description:@"Suppress Copyright info" flags:GBValueNone | GBOptionNoHelp | GBOptionNoPrint];
[options registerOption:'s' long:@"scale" description:@"Scale the cursor to obscene multipliers or get the current scale" flags:GBValueOptional];
[options registerOption:0 long:@"listen" description:@"Keep mousecloak alive to apply the current Cape every user switch" flags:GBValueNone | GBOptionNoHelp | GBOptionNoPrint];
@@ -113,6 +114,7 @@ int main(int argc, char * argv[]) {
BOOL dump = [settings isKeyPresentAtThisLevel:@"dump"];
BOOL scale = [settings isKeyPresentAtThisLevel:@"scale"];
BOOL listen = [settings isKeyPresentAtThisLevel:@"listen"];
BOOL export = [settings isKeyPresentAtThisLevel:@"export"];
int amt = 0;
if (convert) amt++;
@@ -121,6 +123,7 @@ int main(int argc, char * argv[]) {
if (dump) amt++;
if (scale) amt++;
if (listen) amt++;
if (export) amt++;
if (amt > 1) {
MMLog(BOLD RED "One command at a time, son!" RESET);
@@ -147,6 +150,16 @@ int main(int argc, char * argv[]) {
}
goto fin;
} else if (export) {
NSString *input = [settings objectForKey:@"export"];
NSString *output = [settings isKeyPresentAtThisLevel:@"output"] ? [settings objectForKey:@"output"] : nil;
if (!output) {
MMLog(BOLD RED "You must specify an output directory with -o!" RESET);
} else {
exportCape([NSDictionary dictionaryWithContentsOfFile:input], output);
}
goto fin;
} else if (dump) {
dumpCursorsToFile([settings objectForKey:@"dump"]);
} else if (scale) {
+3 -3
View File
@@ -16,8 +16,8 @@ NSString *restoreStringForIdentifier(NSString *identifier) {
void restoreCursorForIdentifier(NSString *ident) {
bool registered = false;
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)ident.UTF8String, &registered);
MCIsCursorRegistered(CGSMainConnectionID(), (char *)ident.UTF8String, &registered);
NSString *restoreIdent = restoreStringForIdentifier(ident);
NSDictionary *cape = capeWithIdentifier(ident);
@@ -25,7 +25,7 @@ void restoreCursorForIdentifier(NSString *ident) {
if (cape && registered) {
applyCapeForIdentifier(cape, restoreIdent);
}
CGSRemoveRegisteredCursor(CGSMainConnectionID(), (char *)ident.UTF8String, false);
}
@@ -6,17 +6,27 @@
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.alexzielenski.${PRODUCT_NAME:rfc1034identifier}</string>
<string>${PRODUCT_NAME}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
<key>LSUIElement</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2014 Alex Zielenski. All rights reserved.</string>
</dict>
</plist>
+17
View File
@@ -0,0 +1,17 @@
//
// main.m
// Mousecape
//
// Created by Alexander Zielenski on 6/18/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "listen.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
listener();
return EXIT_SUCCESS;
}
}
+1 -1
View File
@@ -25,7 +25,7 @@ Tell your friends.
## Where can I get a copy of this sweet tool?
In the [releases section](https://github.com/alexzielenski/Mousecape/releases) of this GitHub page. There are stable reases there. **The current version is 0.0.2**.
In the [releases section](https://github.com/alexzielenski/Mousecape/releases) of this GitHub page. There are stable reases there. **The current version is 0.0.3**.
## LICENSE