Compare commits
52 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 63adfdb342 | |||
| fa0764e04b | |||
| e0c342c291 | |||
| 200c323225 | |||
| dc5974b1e5 | |||
| e1268114a9 | |||
| 835d860546 | |||
| ca2a0134d1 | |||
| 1a5286d567 | |||
| c78b363aed | |||
| 830628bb70 | |||
| 2e7b01e5d7 | |||
| 46d8ce7c57 | |||
| 2bae6bfa00 | |||
| 3a6af2920d | |||
| cbb87fa0e0 | |||
| 52162699c3 | |||
| 746e1b02a5 | |||
| 5b548b9507 | |||
| a3fd1e3023 | |||
| 3368d64376 | |||
| 1948bff0f5 | |||
| e30572a7f1 | |||
| 6ce1490fa9 | |||
| 4aadd80fe8 | |||
| aec4a42363 | |||
| a68912d9b2 | |||
| 2aa38d60cc | |||
| e23797f70a | |||
| 7a9daedc0e | |||
| 88bf570d9b | |||
| 5e432efcf8 | |||
| 23674e6143 | |||
| 6aa869ed43 | |||
| 0d82cd04c8 | |||
| 1178ffd32e | |||
| 1cf5830161 | |||
| a34578a3b9 | |||
| 900313eb22 | |||
| 8107a5a0f8 | |||
| 3ca8dbf5da | |||
| 64b67ec1aa | |||
| be0d63e84d | |||
| 84ca1342c2 | |||
| 57d5c3a78c | |||
| 32f1d18ba8 | |||
| f3fdaad3be | |||
| 992044c873 | |||
| b3f56427d9 | |||
| e7b5fe8d03 | |||
| b1a5d8ca54 | |||
| bb25a10604 |
@@ -0,0 +1 @@
|
||||
WorkspaceSettings.xcsettings
|
||||
@@ -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,20 @@
|
||||
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 */; };
|
||||
FADF0143198A2C9200006228 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FADF013A198A2C7500006228 /* Sparkle.framework */; };
|
||||
FADF0147198A2CAD00006228 /* Sparkle.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FADF013A198A2C7500006228 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||
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 +92,51 @@
|
||||
remoteGlobalIDString = FAC69FAC189D608900BC829D;
|
||||
remoteInfo = mousecloak;
|
||||
};
|
||||
FAC69F86189D603C00BC829D /* PBXContainerItemProxy */ = {
|
||||
FADF0139198A2C7500006228 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = FAC69F59189D603C00BC829D /* Project object */;
|
||||
containerPortal = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 8DC2EF5B0486A6940098B216;
|
||||
remoteInfo = Sparkle;
|
||||
};
|
||||
FADF013B198A2C7500006228 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 61B5F90209C4CEE200B25A18;
|
||||
remoteInfo = "Sparkle Test App";
|
||||
};
|
||||
FADF013D198A2C7500006228 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 612279D90DB5470200AB99EA;
|
||||
remoteInfo = "Sparkle Unit Tests";
|
||||
};
|
||||
FADF013F198A2C7500006228 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 5D06E8D00FD68C7C005AE3F6;
|
||||
remoteInfo = BinaryDelta;
|
||||
};
|
||||
FADF0141198A2C7500006228 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 55C14BB7136EEF1500649790;
|
||||
remoteInfo = Autoupdate;
|
||||
};
|
||||
FADF0144198A2CA100006228 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = FAC69F60189D603C00BC829D;
|
||||
remoteInfo = Mousecape;
|
||||
remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
|
||||
remoteInfo = Sparkle;
|
||||
};
|
||||
/* 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 +147,51 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 1;
|
||||
};
|
||||
FADF0146198A2CA600006228 /* Copy Frameworks */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
FADF0147198A2CAD00006228 /* Sparkle.framework in Copy Frameworks */,
|
||||
);
|
||||
name = "Copy Frameworks";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
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 +207,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 +237,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 +269,14 @@
|
||||
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>"; };
|
||||
FADF012E198A2C7400006228 /* Sparkle.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Sparkle.xcodeproj; path = Sparkle/Sparkle.xcodeproj; 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>"; };
|
||||
@@ -232,32 +316,47 @@
|
||||
files = (
|
||||
FAAEF8F7189EB34700145DF8 /* QuartzCore.framework in Frameworks */,
|
||||
FA35984D189DC55A00288163 /* ServiceManagement.framework in Frameworks */,
|
||||
FADF0143198A2C9200006228 /* Sparkle.framework in Frameworks */,
|
||||
FA359849189DC40100288163 /* Security.framework in Frameworks */,
|
||||
FAC69F65189D603C00BC829D /* Cocoa.framework in Frameworks */,
|
||||
);
|
||||
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 +381,9 @@
|
||||
FAAEF8EE189EB32700145DF8 /* external */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FADF012E198A2C7400006228 /* Sparkle.xcodeproj */,
|
||||
FA14DE8818CE596B00A73BF4 /* Rebel */,
|
||||
FADBC14E18CE51C000B9510F /* DTScrollView */,
|
||||
FA5107DD18A823BD00917185 /* MASPreferences */,
|
||||
FAAEF8EF189EB32700145DF8 /* BTRKit */,
|
||||
);
|
||||
@@ -303,8 +405,8 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FAC69F6A189D603C00BC829D /* Mousecape */,
|
||||
FAC69F88189D603C00BC829D /* MousecapeTests */,
|
||||
FAC69FAF189D608900BC829D /* mousecloak */,
|
||||
FAE5D54A19526F82007620DE /* mousecloakHelper */,
|
||||
FAC69F63189D603C00BC829D /* Frameworks */,
|
||||
FAC69F62189D603C00BC829D /* Products */,
|
||||
);
|
||||
@@ -314,8 +416,8 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FAC69F61189D603C00BC829D /* Mousecape.app */,
|
||||
FAC69F82189D603C00BC829D /* MousecapeTests.xctest */,
|
||||
FAC69FAD189D608900BC829D /* mousecloak */,
|
||||
FAE5D54919526F82007620DE /* com.alexzielenski.mousecloakhelper.app */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
@@ -323,6 +425,8 @@
|
||||
FAC69F63189D603C00BC829D /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA1DC01719527A56009E879C /* CoreGraphics.framework */,
|
||||
FA7582B7193D377300CE223C /* ApplicationServices.framework */,
|
||||
FAAEF8F6189EB34700145DF8 /* QuartzCore.framework */,
|
||||
FA35984C189DC55A00288163 /* ServiceManagement.framework */,
|
||||
FA359848189DC40100288163 /* Security.framework */,
|
||||
@@ -379,24 +483,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 +564,44 @@
|
||||
path = GBCli;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FADBC14E18CE51C000B9510F /* DTScrollView */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FADBC14F18CE51C000B9510F /* DTScrollView.h */,
|
||||
FADBC15018CE51C000B9510F /* DTScrollView.m */,
|
||||
);
|
||||
path = DTScrollView;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FADF012F198A2C7400006228 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FADF013A198A2C7500006228 /* Sparkle.framework */,
|
||||
FADF013C198A2C7500006228 /* Sparkle Test App.app */,
|
||||
FADF013E198A2C7500006228 /* Sparkle Unit Tests.xctest */,
|
||||
FADF0140198A2C7500006228 /* BinaryDelta */,
|
||||
FADF0142198A2C7500006228 /* Autoupdate.app */,
|
||||
);
|
||||
name = Products;
|
||||
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 +668,8 @@
|
||||
FAEE652818A047E8003AA182 /* MMAnimatingImageView.m */,
|
||||
FAEE653718A048EA003AA182 /* MCSpriteLayer.h */,
|
||||
FAEE653818A048EA003AA182 /* MCSpriteLayer.m */,
|
||||
FADBC15218CE535200B9510F /* MCCapePreviewItem.h */,
|
||||
FADBC15318CE535200B9510F /* MCCapePreviewItem.m */,
|
||||
);
|
||||
name = views;
|
||||
path = src/views;
|
||||
@@ -560,11 +686,14 @@
|
||||
FAC69F5F189D603C00BC829D /* Resources */,
|
||||
FAC69F5E189D603C00BC829D /* Frameworks */,
|
||||
FA359841189DAAF900288163 /* Build Number */,
|
||||
FA35984A189DC47800288163 /* Copy Tools */,
|
||||
FAE5D57D1952734F007620DE /* Copy Tool */,
|
||||
FAE5D57F1952737F007620DE /* Copy Helper */,
|
||||
FADF0146198A2CA600006228 /* Copy Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
FADF0145198A2CA100006228 /* PBXTargetDependency */,
|
||||
FA359847189DBEB700288163 /* PBXTargetDependency */,
|
||||
);
|
||||
name = Mousecape;
|
||||
@@ -572,24 +701,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 +718,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 +742,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;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -632,19 +761,97 @@
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
ar,
|
||||
ca,
|
||||
cs,
|
||||
cy,
|
||||
da,
|
||||
de,
|
||||
el,
|
||||
es,
|
||||
fi,
|
||||
fr,
|
||||
he,
|
||||
hu,
|
||||
id,
|
||||
is,
|
||||
it,
|
||||
ja,
|
||||
ko,
|
||||
nb,
|
||||
nl,
|
||||
no,
|
||||
pl,
|
||||
pt_BR,
|
||||
pt_PT,
|
||||
ro,
|
||||
ru,
|
||||
sk,
|
||||
sl,
|
||||
sv,
|
||||
th,
|
||||
tr,
|
||||
uk,
|
||||
zh_CN,
|
||||
zh_TW,
|
||||
English,
|
||||
);
|
||||
mainGroup = FAC69F58189D603C00BC829D;
|
||||
productRefGroup = FAC69F62189D603C00BC829D /* Products */;
|
||||
projectDirPath = "";
|
||||
projectReferences = (
|
||||
{
|
||||
ProductGroup = FADF012F198A2C7400006228 /* Products */;
|
||||
ProjectRef = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
|
||||
},
|
||||
);
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
FAC69F60189D603C00BC829D /* Mousecape */,
|
||||
FAC69F81189D603C00BC829D /* MousecapeTests */,
|
||||
FAC69FAC189D608900BC829D /* mousecloak */,
|
||||
FAE5D54819526F82007620DE /* com.alexzielenski.mousecloakhelper */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXReferenceProxy section */
|
||||
FADF013A198A2C7500006228 /* Sparkle.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = Sparkle.framework;
|
||||
remoteRef = FADF0139198A2C7500006228 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
FADF013C198A2C7500006228 /* Sparkle Test App.app */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.application;
|
||||
path = "Sparkle Test App.app";
|
||||
remoteRef = FADF013B198A2C7500006228 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
FADF013E198A2C7500006228 /* Sparkle Unit Tests.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = "Sparkle Unit Tests.xctest";
|
||||
remoteRef = FADF013D198A2C7500006228 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
FADF0140198A2C7500006228 /* BinaryDelta */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = "compiled.mach-o.executable";
|
||||
path = BinaryDelta;
|
||||
remoteRef = FADF013F198A2C7500006228 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
FADF0142198A2C7500006228 /* Autoupdate.app */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.application;
|
||||
path = Autoupdate.app;
|
||||
remoteRef = FADF0141198A2C7500006228 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
/* End PBXReferenceProxy section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
FAC69F5F189D603C00BC829D /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
@@ -661,11 +868,10 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
FAC69F80189D603C00BC829D /* Resources */ = {
|
||||
FAE5D54719526F82007620DE /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
FAC69F8D189D603C00BC829D /* InfoPlist.strings in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -707,31 +913,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 +954,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,10 +977,10 @@
|
||||
target = FAC69FAC189D608900BC829D /* mousecloak */;
|
||||
targetProxy = FA359846189DBEB700288163 /* PBXContainerItemProxy */;
|
||||
};
|
||||
FAC69F87189D603C00BC829D /* PBXTargetDependency */ = {
|
||||
FADF0145198A2CA100006228 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = FAC69F60189D603C00BC829D /* Mousecape */;
|
||||
targetProxy = FAC69F86189D603C00BC829D /* PBXContainerItemProxy */;
|
||||
name = Sparkle;
|
||||
targetProxy = FADF0144198A2CA100006228 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
@@ -807,14 +1025,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 +1043,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 +1063,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 +1082,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 +1096,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 +1104,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 +1118,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 +1151,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 +1162,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 +1236,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 +1245,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 */;
|
||||
|
||||
BIN
Binary file not shown.
+96
@@ -0,0 +1,96 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0500"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "FAC69F60189D603C00BC829D"
|
||||
BuildableName = "Mousecape.app"
|
||||
BlueprintName = "Mousecape"
|
||||
ReferencedContainer = "container:Mousecape.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
buildConfiguration = "Debug">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "FAC69F81189D603C00BC829D"
|
||||
BuildableName = "MousecapeTests.xctest"
|
||||
BlueprintName = "MousecapeTests"
|
||||
ReferencedContainer = "container:Mousecape.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "FAC69F60189D603C00BC829D"
|
||||
BuildableName = "Mousecape.app"
|
||||
BlueprintName = "Mousecape"
|
||||
ReferencedContainer = "container:Mousecape.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
buildConfiguration = "Release"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "FAC69F60189D603C00BC829D"
|
||||
BuildableName = "Mousecape.app"
|
||||
BlueprintName = "Mousecape"
|
||||
ReferencedContainer = "container:Mousecape.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
buildConfiguration = "Release"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "FAC69F60189D603C00BC829D"
|
||||
BuildableName = "Mousecape.app"
|
||||
BlueprintName = "Mousecape"
|
||||
ReferencedContainer = "container:Mousecape.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
+86
@@ -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>
|
||||
+21
-1
@@ -4,6 +4,11 @@
|
||||
<dict>
|
||||
<key>SchemeUserState</key>
|
||||
<dict>
|
||||
<key>Mousecape Release.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>Mousecape.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
@@ -12,7 +17,12 @@
|
||||
<key>mousecloak.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>1</integer>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<key>mousecloakHelper.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>3</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
@@ -37,6 +47,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>
|
||||
|
||||
@@ -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="6185.7" 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="6185.7"/>
|
||||
</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"/>
|
||||
@@ -155,11 +146,10 @@
|
||||
</connections>
|
||||
</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"/>
|
||||
<rect key="frame" x="22" y="0.0" width="22" height="20"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="22" id="L21-Ci-myo"/>
|
||||
<constraint firstAttribute="height" constant="22" id="M80-94-gpJ"/>
|
||||
<constraint firstAttribute="height" constant="20" id="M80-94-gpJ"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="smallSquare" bezelStyle="smallSquare" image="NSRemoveTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="HjH-hq-TxT">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
@@ -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>
|
||||
@@ -192,7 +181,7 @@
|
||||
<constraint firstItem="w4h-lB-jLi" firstAttribute="leading" secondItem="0ps-WH-ASN" secondAttribute="trailing" id="oqH-vB-hO8"/>
|
||||
<constraint firstItem="0ps-WH-ASN" firstAttribute="bottom" secondItem="w4h-lB-jLi" secondAttribute="bottom" id="sWe-gf-GX0"/>
|
||||
<constraint firstItem="2UQ-R4-qJn" firstAttribute="leading" secondItem="IHY-vi-Wpr" secondAttribute="leading" id="thB-tX-fKx"/>
|
||||
<constraint firstItem="0ps-WH-ASN" firstAttribute="height" secondItem="w4h-lB-jLi" secondAttribute="height" id="uJj-nv-0fc"/>
|
||||
<constraint firstItem="0ps-WH-ASN" firstAttribute="height" secondItem="w4h-lB-jLi" secondAttribute="height" constant="2" id="uJj-nv-0fc"/>
|
||||
<constraint firstAttribute="bottom" secondItem="2UQ-R4-qJn" secondAttribute="bottom" constant="22" id="vLX-hs-yVP"/>
|
||||
</constraints>
|
||||
</customView>
|
||||
@@ -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="139.5" y="555.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,50 +440,47 @@
|
||||
<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"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.frameCount" id="E0q-ga-ftR"/>
|
||||
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.frameCount" id="05V-RH-y2o">
|
||||
<dictionary key="options">
|
||||
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
|
||||
</dictionary>
|
||||
</binding>
|
||||
<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"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.frameDuration" id="I6z-BZ-xhp"/>
|
||||
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.frameDuration" id="pBC-y0-ehq">
|
||||
<dictionary key="options">
|
||||
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
|
||||
</dictionary>
|
||||
</binding>
|
||||
<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"/>
|
||||
@@ -516,90 +488,86 @@
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.hotSpot" id="aFb-fI-aHw"/>
|
||||
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.hotSpot" id="7E7-XS-E4D">
|
||||
<dictionary key="options">
|
||||
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
|
||||
</dictionary>
|
||||
</binding>
|
||||
<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 +579,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 +690,4 @@
|
||||
<image name="NSAddTemplate" width="8" height="8"/>
|
||||
<image name="NSRemoveTemplate" width="8" height="8"/>
|
||||
</resources>
|
||||
</document>
|
||||
</document>
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
<?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="6185.11" systemVersion="13E28" 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="6185.11"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="MCLibraryWindowController">
|
||||
<connections>
|
||||
<outlet property="appliedAccessory" destination="3Ui-b0-Yod" id="2Ik-Bo-djE"/>
|
||||
<outlet property="libraryViewController" destination="zL4-Ay-t4Q" id="DE1-rb-MWQ"/>
|
||||
<outlet property="progressBar" destination="F5l-qD-fvC" id="VNK-If-Tfi"/>
|
||||
<outlet property="progressField" destination="Ui8-vk-7P8" id="Esy-lZ-9RN"/>
|
||||
<outlet property="window" destination="1" id="3"/>
|
||||
</connections>
|
||||
</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">
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<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 +24,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 +50,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 +64,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 +76,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 +90,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 +122,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 +151,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 +168,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 +184,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 +202,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 +220,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 +245,44 @@ 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>
|
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="DeD-dq-yBF" customClass="NSPanel">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" utility="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||
<rect key="contentRect" x="272" y="172" width="452" height="58"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/>
|
||||
<view key="contentView" id="me1-hA-pTT">
|
||||
<rect key="frame" x="0.0" y="0.0" width="452" height="58"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<progressIndicator maxValue="100" indeterminate="YES" style="bar" translatesAutoresizingMaskIntoConstraints="NO" id="F5l-qD-fvC">
|
||||
<rect key="frame" x="15" y="19" width="343" height="20"/>
|
||||
</progressIndicator>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ui8-vk-7P8">
|
||||
<rect key="frame" x="364" y="21" width="75" height="17"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="000 of 129" id="sq0-HM-mp6">
|
||||
<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>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="F5l-qD-fvC" firstAttribute="leading" secondItem="me1-hA-pTT" secondAttribute="leading" constant="15" id="1rr-uN-NwK"/>
|
||||
<constraint firstItem="F5l-qD-fvC" firstAttribute="centerY" secondItem="Ui8-vk-7P8" secondAttribute="centerY" constant="0.5" id="FgD-90-fQk"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Ui8-vk-7P8" secondAttribute="trailing" constant="15" id="OgP-qZ-5ss"/>
|
||||
<constraint firstItem="Ui8-vk-7P8" firstAttribute="leading" secondItem="F5l-qD-fvC" secondAttribute="trailing" constant="8" id="Q6O-6O-84O"/>
|
||||
<constraint firstAttribute="centerY" secondItem="F5l-qD-fvC" secondAttribute="centerY" id="yZk-CB-OJj"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<point key="canvasLocation" x="499" y="-470"/>
|
||||
</window>
|
||||
</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>
|
||||
|
||||
@@ -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="6185.11" systemVersion="13E28" 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="6185.11"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
||||
@@ -11,7 +10,7 @@
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<menu title="AMainMenu" systemMenu="main" id="29">
|
||||
<items>
|
||||
<menuItem title="Mousecape" id="56">
|
||||
@@ -33,6 +32,9 @@
|
||||
</menuItem>
|
||||
<menuItem title="Check for Updates..." id="igk-i0-oH0">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="checkForUpdates:" target="1HC-av-0d2" id="TKL-G4-NhR"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Install Helper Tool" id="Ui2-VN-tbP">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
@@ -333,12 +335,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 +348,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">
|
||||
@@ -371,6 +373,12 @@ CA
|
||||
<action selector="restoreCape:" target="494" id="2ve-Ez-ktd"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Dump Cursors…" id="CYY-iE-0bP">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="dumpCapeAction:" target="-1" id="B89-Hc-T1C"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
@@ -418,5 +426,6 @@ CA
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="420" customClass="NSFontManager"/>
|
||||
<customObject id="1HC-av-0d2" customClass="SUUpdater"/>
|
||||
</objects>
|
||||
</document>
|
||||
</document>
|
||||
|
||||
@@ -14,8 +14,6 @@
|
||||
#import "MASPreferencesWindowController.h"
|
||||
#import "MCGeneralPreferencesController.h"
|
||||
|
||||
static AuthorizationRef obtainRights();
|
||||
|
||||
@interface MCAppDelegate () {
|
||||
MASPreferencesWindowController *_preferencesWindowController;
|
||||
}
|
||||
@@ -26,14 +24,17 @@ static AuthorizationRef obtainRights();
|
||||
@implementation MCAppDelegate
|
||||
@dynamic preferencesWindowController;
|
||||
|
||||
- (void)applicationWillFinishLaunching:(NSNotification *)notification {
|
||||
self.libraryWindowController = [[MCLibraryWindowController alloc] initWithWindowNibName:@"Library"];
|
||||
[self.libraryWindowController loadWindow];
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
||||
[self configureHelperToolMenuItem];
|
||||
self.libraryWindowController = [[MCLibraryWindowController alloc] initWithWindowNibName:@"Library"];
|
||||
[self.libraryWindowController showWindow:self];
|
||||
}
|
||||
|
||||
- (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag {
|
||||
[self.libraryWindowController showWindow:sender];
|
||||
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
|
||||
return YES;
|
||||
}
|
||||
|
||||
@@ -47,54 +48,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 +143,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;
|
||||
}
|
||||
|
||||
@@ -36,11 +36,11 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.0.2</string>
|
||||
<string>0.0.5</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1083</string>
|
||||
<string>1581</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.utilities</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
@@ -51,6 +51,10 @@
|
||||
<string>MainMenu</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
<key>SUEnableAutomaticChecks</key>
|
||||
<true/>
|
||||
<key>SUFeedURL</key>
|
||||
<string>https://raw.githubusercontent.com/alexzielenski/Mousecape/master/appcast.xml</string>
|
||||
<key>UTExportedTypeDeclarations</key>
|
||||
<array>
|
||||
<dict>
|
||||
|
||||
@@ -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
|
||||
+114
-111
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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];
|
||||
@@ -69,8 +64,14 @@
|
||||
}
|
||||
|
||||
- (void)imageView:(MMAnimatingImageView *)imageView didAcceptDroppedImages:(NSArray *)images {
|
||||
CGFloat scale = imageView.scale;
|
||||
[self.cursor setRepresentation:images.lastObject forScale:cursorScaleForScale(scale)];
|
||||
MCCursorScale scale = cursorScaleForScale(imageView.scale);
|
||||
|
||||
if (NSEvent.modifierFlags == NSAlternateKeyMask) {
|
||||
[self.cursor addFrame:[MCCursor composeRepresentationWithFrames:images] forScale:scale];
|
||||
} else {
|
||||
[self.cursor setRepresentation:[MCCursor composeRepresentationWithFrames:images] forScale:scale];
|
||||
self.cursor.frameCount = images.count;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)imageView:(MMAnimatingImageView *)imageView didDragOutImage:(NSImage *)image {
|
||||
@@ -99,3 +100,4 @@
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -78,10 +78,10 @@ const char MCCursorNameContext;
|
||||
NSUInteger index = [self.cursors indexForInsertingObject:lib sortedUsingComparator:self.class.sortComparator];
|
||||
NSIndexSet *indices = [NSIndexSet indexSetWithIndex:index];
|
||||
|
||||
[self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indices forKey:@"capes"];
|
||||
[self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indices forKey:@"cursors"];
|
||||
[self.cursors insertObject:lib atIndex:index];
|
||||
[self startObservingCursor:lib];
|
||||
[self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indices forKey:@"capes"];
|
||||
[self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indices forKey:@"cursors"];
|
||||
[self.tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:index + 1] withAnimation:NSTableViewAnimationSlideUp];
|
||||
}
|
||||
} else if (kind == NSKeyValueChangeRemoval) {
|
||||
@@ -90,10 +90,10 @@ const char MCCursorNameContext;
|
||||
|
||||
if (index != NSNotFound) {
|
||||
NSIndexSet *indices = [NSIndexSet indexSetWithIndex:index];
|
||||
[self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"capes"];
|
||||
[self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"cursors"];
|
||||
[self stopObservingCursor:lib];
|
||||
[self.cursors removeObjectAtIndex:index];
|
||||
[self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"capes"];
|
||||
[self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"cursors"];
|
||||
[self.tableView removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:index + 1] withAnimation:NSTableViewAnimationSlideUp | NSTableViewAnimationEffectFade];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
- (NSURL *)URLForCape:(MCCursorLibrary *)cape;
|
||||
|
||||
- (NSSet *)capesWithIdentifier:(NSString *)identifier;
|
||||
- (BOOL)dumpCursorsWithProgressBlock:(BOOL (^)(NSUInteger current, NSUInteger total))block;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -10,8 +10,7 @@
|
||||
#import "NSOrderedSet+AZSortedInsert.h"
|
||||
#import "apply.h"
|
||||
#import "restore.h"
|
||||
|
||||
const char MCLibraryIdentifierContext;
|
||||
#import "create.h"
|
||||
|
||||
@interface MCLibraryController ()
|
||||
@property (nonatomic, readwrite, strong) NSUndoManager *undoManager;
|
||||
@@ -19,18 +18,21 @@ const char MCLibraryIdentifierContext;
|
||||
@property (readwrite, copy) NSURL *libraryURL;
|
||||
@property (readwrite, weak) MCCursorLibrary *appliedCape;
|
||||
- (void)loadLibrary;
|
||||
- (void)willSaveNotification:(NSNotification *)note;
|
||||
@end
|
||||
|
||||
@implementation MCLibraryController
|
||||
|
||||
- (NSURL *)URLForCape:(MCCursorLibrary *)cape {
|
||||
return [NSURL fileURLWithPathComponents:@[ self.libraryURL.path, [cape.identifier stringByAppendingPathExtension:@"cape"] ]];
|
||||
return [NSURL fileURLWithPathComponents:@[ self.libraryURL.path, [cape.identifier stringByAppendingPathExtension:@"cape"] ]];;
|
||||
}
|
||||
|
||||
- (instancetype)initWithURL:(NSURL *)url {
|
||||
if ((self = [self init])) {
|
||||
self.libraryURL = url;
|
||||
self.undoManager = [[NSUndoManager alloc] init];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willSaveNotification:) name:MCLibraryWillSaveNotificationName object:nil];
|
||||
[self loadLibrary];
|
||||
}
|
||||
|
||||
@@ -46,6 +48,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];
|
||||
|
||||
@@ -60,17 +66,14 @@ const char MCLibraryIdentifierContext;
|
||||
}
|
||||
|
||||
- (void)importCapeAtURL:(NSURL *)url {
|
||||
MCCursorLibrary *lib = [MCCursorLibrary cursorLibraryWithContentsOfURL:url];
|
||||
NSURL *destinationURL = [self URLForCape:lib];
|
||||
NSError *error = nil;
|
||||
[[NSFileManager defaultManager] copyItemAtURL:lib.fileURL toURL:destinationURL error:&error];
|
||||
if (!error) {
|
||||
lib.fileURL = destinationURL;
|
||||
[self addCape:lib];
|
||||
}
|
||||
[self importCape:[MCCursorLibrary cursorLibraryWithContentsOfURL:url]];
|
||||
}
|
||||
|
||||
- (void)importCape:(MCCursorLibrary *)lib {
|
||||
if ([[self.capes valueForKeyPath:@"identifier"] containsObject:lib.identifier]) {
|
||||
lib.identifier = [lib.identifier stringByAppendingFormat:@".%@", UUID()];
|
||||
}
|
||||
|
||||
lib.fileURL = [self URLForCape:lib];
|
||||
[lib writeToFile:lib.fileURL.path atomically:NO];
|
||||
|
||||
@@ -79,7 +82,7 @@ const char MCLibraryIdentifierContext;
|
||||
|
||||
|
||||
- (void)addCape:(MCCursorLibrary *)cape {
|
||||
if ([self.capes containsObject:cape]) {
|
||||
if ([self.capes containsObject:cape] || [[self.capes valueForKeyPath:@"identifier"] containsObject:cape.identifier]) {
|
||||
NSLog(@"Not adding %@ to the library because an object with that identifier already exists", cape.identifier);
|
||||
return;
|
||||
}
|
||||
@@ -91,18 +94,18 @@ const char MCLibraryIdentifierContext;
|
||||
|
||||
NSSet *change = [NSSet setWithObject:cape];
|
||||
[self willChangeValueForKey:@"capes" withSetMutation:NSKeyValueUnionSetMutation usingObjects:change];
|
||||
|
||||
[cape addObserver:self forKeyPath:@"identifier" options:NSKeyValueObservingOptionOld context:(void *)&MCLibraryIdentifierContext];
|
||||
|
||||
|
||||
cape.library = self;
|
||||
[self.capes addObject:cape];
|
||||
|
||||
|
||||
[[self.undoManager prepareWithInvocationTarget:self] removeCape:cape];
|
||||
if (!self.undoManager.isUndoing) {
|
||||
[self.undoManager setActionName:[@"Add " stringByAppendingString:cape.name]];
|
||||
}
|
||||
|
||||
[self didChangeValueForKey:@"capes" withSetMutation:NSKeyValueUnionSetMutation usingObjects:change];
|
||||
|
||||
[cape.undoManager removeAllActions];
|
||||
}
|
||||
|
||||
|
||||
@@ -112,9 +115,7 @@ const char MCLibraryIdentifierContext;
|
||||
[self willChangeValueForKey:@"capes" withSetMutation:NSKeyValueMinusSetMutation usingObjects:change];
|
||||
if (cape == self.appliedCape)
|
||||
[self restoreCape];
|
||||
|
||||
[cape removeObserver:self forKeyPath:@"identifier" context:(void *)&MCLibraryIdentifierContext];
|
||||
|
||||
|
||||
if (cape.library == self)
|
||||
cape.library = nil;
|
||||
|
||||
@@ -151,21 +152,30 @@ const char MCLibraryIdentifierContext;
|
||||
return [self.capes filteredSetUsingPredicate:pred];
|
||||
}
|
||||
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
|
||||
if (context == &MCLibraryIdentifierContext) {
|
||||
// change the file url to reflect the new identifier
|
||||
MCCursorLibrary *cape = object;
|
||||
NSURL *oldURL = cape.fileURL;
|
||||
[cape setFileURL:[self URLForCape:cape]];
|
||||
|
||||
NSError *error = nil;
|
||||
[[NSFileManager defaultManager] moveItemAtURL:oldURL toURL:cape.fileURL error:&error];
|
||||
if (error) {
|
||||
NSLog(@"Failed to rename the identifier of the cape %@. Reverting to %@...", cape.identifier, change[NSKeyValueChangeOldKey]);
|
||||
cape.identifier = change[NSKeyValueChangeOldKey];
|
||||
cape.fileURL = [self URLForCape:cape];
|
||||
}
|
||||
- (void)willSaveNotification:(NSNotification *)note {
|
||||
MCCursorLibrary *cape = note.object;
|
||||
NSURL *oldURL = cape.fileURL;
|
||||
[cape setFileURL:[self URLForCape:cape]];
|
||||
NSError *error = nil;
|
||||
[[NSFileManager defaultManager] removeItemAtURL:oldURL error:&error];
|
||||
|
||||
if (error) {
|
||||
NSLog(@"error removing cape after rename: %@", error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
- (BOOL)dumpCursorsWithProgressBlock:(BOOL (^)(NSUInteger current, NSUInteger total))block {
|
||||
NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat: @"Mousecape Dump (%f).cape", NSDate.date.timeIntervalSince1970]];
|
||||
if (dumpCursorsToFile(path, block)) {
|
||||
__weak MCLibraryController *weakSelf = self;
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[weakSelf importCapeAtURL:[NSURL fileURLWithPath:path]];
|
||||
});
|
||||
return YES;
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -122,6 +122,11 @@ const char MCLibraryNameContext;
|
||||
[self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"capes"];
|
||||
|
||||
[self.tableView removeRowsAtIndexes:indices withAnimation:NSTableViewAnimationSlideUp | NSTableViewAnimationEffectFade];
|
||||
|
||||
if (self.editWindowController.cursorLibrary == lib) {
|
||||
self.editWindowController.cursorLibrary = nil;
|
||||
[self.editWindowController close];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,8 +10,10 @@
|
||||
#import "MCLibraryViewController.h"
|
||||
|
||||
@interface MCLibraryWindowController : NSWindowController <NSWindowDelegate>
|
||||
@property (assign) IBOutlet MCLibraryViewController *libraryViewController;
|
||||
@property (assign) IBOutlet NSView *appliedAccessory;
|
||||
@property (weak) IBOutlet MCLibraryViewController *libraryViewController;
|
||||
@property (weak) IBOutlet NSView *appliedAccessory;
|
||||
@property (weak) IBOutlet NSProgressIndicator *progressBar;
|
||||
@property (weak) IBOutlet NSTextField *progressField;
|
||||
@end
|
||||
|
||||
@interface MCAppliedCapeValueTransformer : NSValueTransformer
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
|
||||
@implementation MCLibraryWindowController
|
||||
|
||||
- (void)awakeFromNib {
|
||||
[self composeAccessory];
|
||||
}
|
||||
|
||||
- (id)initWithWindow:(NSWindow *)window {
|
||||
if ((self = [super initWithWindow:window])) {
|
||||
|
||||
@@ -22,9 +26,9 @@
|
||||
}
|
||||
|
||||
- (void)windowDidLoad {
|
||||
NSLog(@"window load");
|
||||
[super windowDidLoad];
|
||||
[self composeAccessory];
|
||||
|
||||
}
|
||||
|
||||
- (NSString *)windowNibName {
|
||||
@@ -65,7 +69,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 +79,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 +89,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 +104,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)duplicateCape:(NSMenuItem *)sender {
|
||||
- (IBAction)duplicateCapeAction:(NSMenuItem *)sender {
|
||||
MCCursorLibrary *cape = nil;
|
||||
if (sender.tag == -1)
|
||||
cape = self.libraryViewController.clickedCape;
|
||||
@@ -110,11 +114,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;
|
||||
@@ -124,6 +128,30 @@
|
||||
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:@[ cape.fileURL ]];
|
||||
}
|
||||
|
||||
- (IBAction)dumpCapeAction:(NSMenuItem *)sender {
|
||||
[self.window beginSheet:self.progressBar.window completionHandler:nil];
|
||||
__weak MCLibraryWindowController *weakSelf = self;
|
||||
self.progressBar.doubleValue = 0.0;
|
||||
[self.progressBar setIndeterminate:NO];
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
|
||||
[weakSelf.libraryViewController.libraryController dumpCursorsWithProgressBlock:^BOOL (NSUInteger current, NSUInteger total) {
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
weakSelf.progressField.stringValue = [NSString stringWithFormat:@"%lu of %lu", (unsigned long)current, (unsigned long)total];
|
||||
weakSelf.progressBar.minValue = 0;
|
||||
weakSelf.progressBar.maxValue = total;
|
||||
weakSelf.progressBar.doubleValue = current;
|
||||
});
|
||||
return YES;
|
||||
}];
|
||||
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
[weakSelf.window endSheet:self.progressBar.window];
|
||||
[[NSCursor arrowCursor] set];
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation MCAppliedCapeValueTransformer
|
||||
|
||||
@@ -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="6185.11" systemVersion="13D65" 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="6185.11"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="MCGeneralPreferencesController">
|
||||
@@ -11,22 +11,48 @@
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<customView id="1">
|
||||
<rect key="frame" x="0.0" y="0.0" width="480" height="118"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="480" height="143"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ndv-TL-Pur">
|
||||
<rect key="frame" x="18" y="106" width="206" height="17"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="I am... handed." id="a3X-1e-eOG">
|
||||
<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>
|
||||
<segmentedControl verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8pe-9P-fa1">
|
||||
<rect key="frame" x="68" y="101" width="94" height="25"/>
|
||||
<segmentedCell key="cell" borderStyle="border" alignment="left" style="texturedSquare" trackingMode="selectOne" id="Hdu-Yg-F0d">
|
||||
<font key="font" metaFont="system"/>
|
||||
<segments>
|
||||
<segment label="right" selected="YES"/>
|
||||
<segment label="left" tag="1"/>
|
||||
</segments>
|
||||
</segmentedCell>
|
||||
<connections>
|
||||
<binding destination="Dw0-Gt-5ak" name="selectedIndex" keyPath="values.MCHandedness" id="ZqA-zg-dh2">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="0"/>
|
||||
<integer key="NSNoSelectionPlaceholder" value="0"/>
|
||||
<integer key="NSNotApplicablePlaceholder" value="0"/>
|
||||
<integer key="NSNullPlaceholder" value="0"/>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</segmentedControl>
|
||||
<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"/>
|
||||
<rect key="frame" x="18" y="15" width="392" height="27"/>
|
||||
<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"/>
|
||||
</connections>
|
||||
</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"/>
|
||||
<rect key="frame" x="20" y="48" width="82" height="17"/>
|
||||
<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"/>
|
||||
@@ -34,8 +60,7 @@
|
||||
</textFieldCell>
|
||||
</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"/>
|
||||
<rect key="frame" x="18" y="77" width="265" height="17"/>
|
||||
<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"/>
|
||||
@@ -43,9 +68,8 @@
|
||||
</textFieldCell>
|
||||
</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">
|
||||
<rect key="frame" x="119" y="71" width="111" height="25"/>
|
||||
<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 +79,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"/>
|
||||
<rect key="frame" x="416" y="21" width="44" height="19"/>
|
||||
<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"/>
|
||||
@@ -84,7 +103,8 @@
|
||||
</connections>
|
||||
</textField>
|
||||
</subviews>
|
||||
<point key="canvasLocation" x="311" y="408.5"/>
|
||||
</customView>
|
||||
<userDefaultsController representsSharedInstance="YES" id="Dw0-Gt-5ak"/>
|
||||
</objects>
|
||||
</document>
|
||||
</document>
|
||||
|
||||
@@ -33,11 +33,13 @@ extern MCCursorScale cursorScaleForScale(CGFloat scale);
|
||||
|
||||
- (void)setRepresentation:(NSImageRep *)imageRep forScale:(MCCursorScale)scale;
|
||||
- (void)removeRepresentationForScale:(MCCursorScale)scale;
|
||||
- (void)addFrame:(NSImageRep *)frame forScale:(MCCursorScale)scale;
|
||||
|
||||
- (NSImageRep *)representationForScale:(MCCursorScale)scale;
|
||||
- (NSImageRep *)representationWithScale:(CGFloat)scale;
|
||||
|
||||
- (NSDictionary *)dictionaryRepresentation;
|
||||
+ (NSImageRep *)composeRepresentationWithFrames:(NSArray *)frames;
|
||||
|
||||
// Derived Properties
|
||||
- (NSImage *)imageWithAllReps;
|
||||
|
||||
@@ -17,6 +17,7 @@ MCCursorScale cursorScaleForScale(CGFloat scale) {
|
||||
|
||||
@interface MCCursor ()
|
||||
@property (readwrite, strong) NSMutableDictionary *representations;
|
||||
- (NSInteger)framesForScale:(MCCursorScale)scale;
|
||||
- (BOOL)_readFromDictionary:(NSDictionary *)dictionary ofVersion:(CGFloat)version;
|
||||
@end
|
||||
|
||||
@@ -185,12 +186,84 @@ MCCursorScale cursorScaleForScale(CGFloat scale) {
|
||||
[self.representations setObject:imageRep forKey:@(scale)];
|
||||
else
|
||||
[self.representations removeObjectForKey:@(scale)];
|
||||
|
||||
if (self.representations.count == 1) {
|
||||
// This is the first object, set the image size to this
|
||||
NSSize size = NSMakeSize((double)imageRep.pixelsWide / (scale / 100.0), (double)imageRep.pixelsHigh / self.frameCount / (scale / 100.0));
|
||||
if (!NSEqualSizes(size, NSZeroSize)) {
|
||||
self.size = size;
|
||||
}
|
||||
}
|
||||
|
||||
[self didChangeValueForKey:key];
|
||||
[self didChangeValueForKey:@"representations"];
|
||||
}
|
||||
|
||||
- (void)addFrame:(NSImageRep *)frame forScale:(MCCursorScale)scale {
|
||||
NSImageRep *rep = [self representationForScale:scale];
|
||||
NSImageRep *newRep = [self.class composeRepresentationWithFrames:@[ rep, frame ]];
|
||||
|
||||
NSInteger frames = newRep.pixelsHigh / self.size.height;
|
||||
|
||||
if (self.frameCount < frames) {
|
||||
self.frameCount = frames;
|
||||
}
|
||||
|
||||
[self setRepresentation:newRep forScale:scale];
|
||||
}
|
||||
|
||||
+ (NSImageRep *)composeRepresentationWithFrames:(NSArray *)frames {
|
||||
if (frames.count == 0)
|
||||
return nil;
|
||||
if (frames.count == 1)
|
||||
return frames.firstObject;
|
||||
|
||||
NSUInteger height = [[frames valueForKeyPath:@"@sum.pixelsHigh"] unsignedIntegerValue];
|
||||
NSUInteger width = [(NSImageRep *)frames[0] pixelsWide];
|
||||
|
||||
NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
|
||||
pixelsWide:width
|
||||
pixelsHigh:height
|
||||
bitsPerSample:8
|
||||
samplesPerPixel:4
|
||||
hasAlpha:YES
|
||||
isPlanar:NO
|
||||
colorSpaceName:NSDeviceRGBColorSpace
|
||||
bytesPerRow:4 * width
|
||||
bitsPerPixel:32];
|
||||
NSGraphicsContext *ctx = [NSGraphicsContext graphicsContextWithBitmapImageRep:newRep];
|
||||
[NSGraphicsContext saveGraphicsState];
|
||||
[NSGraphicsContext setCurrentContext:ctx];
|
||||
|
||||
NSUInteger currentY = 0;
|
||||
for (NSInteger idx = frames.count - 1; idx >= 0; idx--) {
|
||||
NSImageRep *rep = frames[idx];
|
||||
if (rep.pixelsWide != width) {
|
||||
NSLog(@"Can't create representation from images of different widths");
|
||||
return nil;
|
||||
}
|
||||
|
||||
[rep drawInRect:NSMakeRect(0, currentY, rep.pixelsWide, rep.pixelsHigh)
|
||||
fromRect:NSZeroRect
|
||||
operation:NSCompositeSourceOver
|
||||
fraction:1.0
|
||||
respectFlipped:YES
|
||||
hints:nil];
|
||||
|
||||
currentY += rep.pixelsHigh;
|
||||
}
|
||||
|
||||
[NSGraphicsContext restoreGraphicsState];
|
||||
|
||||
return newRep;
|
||||
}
|
||||
|
||||
- (NSInteger)framesForScale:(MCCursorScale)scale {
|
||||
return [self representationForScale:scale].pixelsHigh / self.size.height;
|
||||
}
|
||||
|
||||
- (void)removeRepresentationForScale:(MCCursorScale)scale {
|
||||
[self setRepresentation:Nil forScale:scale];
|
||||
[self setRepresentation:nil forScale:scale];
|
||||
}
|
||||
|
||||
- (NSImageRep *)representationForScale:(MCCursorScale)scale {
|
||||
@@ -203,7 +276,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;
|
||||
}
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "MCCursor.h"
|
||||
|
||||
extern NSString *const MCLibraryWillSaveNotificationName;
|
||||
extern NSString *const MCLibraryDidSaveNotificationName;
|
||||
|
||||
@class MCLibraryController;
|
||||
@interface MCCursorLibrary : NSObject <NSCopying>
|
||||
@property (nonatomic, copy) NSString *name;
|
||||
@@ -18,7 +21,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;
|
||||
|
||||
|
||||
@@ -8,11 +8,16 @@
|
||||
|
||||
#import "MCCursorLibrary.h"
|
||||
|
||||
NSString *const MCLibraryWillSaveNotificationName = @"MCLibraryWillSave";
|
||||
NSString *const MCLibraryDidSaveNotificationName = @"MCLibraryDidSave";
|
||||
|
||||
@interface MCCursorLibrary ()
|
||||
@property (nonatomic, strong) NSUndoManager *undoManager;
|
||||
@property (nonatomic, readwrite, strong) NSMutableSet *cursors;
|
||||
@property (nonatomic, assign) NSUInteger changeCount;
|
||||
@property (nonatomic, assign) NSUInteger lastChangeCount;
|
||||
@property (nonatomic, strong) NSArray *observers;
|
||||
@property (nonatomic, copy) NSString *oldIdentifier;
|
||||
|
||||
- (BOOL)_readFromDictionary:(NSDictionary *)dictionary;
|
||||
- (void)addCursorsFromDictionary:(NSDictionary *)cursorDicts ofVersion:(CGFloat)doubleVersion;
|
||||
@@ -28,7 +33,7 @@
|
||||
@end
|
||||
|
||||
@implementation MCCursorLibrary
|
||||
@dynamic isDirty;
|
||||
@dynamic dirty;
|
||||
|
||||
+ (NSArray *)undoProperties {
|
||||
return @[ @"identifier", @"name", @"author", @"hiDPI", @"version", @"inCloud" ];
|
||||
@@ -88,18 +93,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 +139,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 +200,10 @@
|
||||
for (MCCursor *cursor in self.cursors) {
|
||||
[self stopObservingCursor:cursor];
|
||||
}
|
||||
|
||||
for (id observer in self.observers) {
|
||||
[NSNotificationCenter.defaultCenter removeObserver:observer];
|
||||
}
|
||||
}
|
||||
|
||||
const char MCCursorLibraryPropertiesContext;
|
||||
@@ -237,6 +248,10 @@ const char MCCursorPropertiesContext;
|
||||
if (!self.undoManager.isUndoing) {
|
||||
[self.undoManager setActionName:[[@"Change " stringByAppendingString:decamelized] capitalizedString]];
|
||||
}
|
||||
|
||||
if ([keyPath isEqualToString:@"identifier"]) {
|
||||
self.oldIdentifier = oldValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -341,11 +356,13 @@ const char MCCursorPropertiesContext;
|
||||
NSLocalizedDescriptionKey: NSLocalizedString(@"Save failed", nil),
|
||||
NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedString(@"Multiple cursors with the name(s): %@ exist.", nil), duplicates] }];
|
||||
}
|
||||
|
||||
// [self.undoManager removeAllActions];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MCLibraryWillSaveNotificationName object:self];
|
||||
|
||||
BOOL success = [self writeToFile:self.fileURL.path atomically:NO];
|
||||
if (success) {
|
||||
[self updateChangeCount:NSChangeCleared];
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MCLibraryDidSaveNotificationName object:self];
|
||||
return nil;
|
||||
}
|
||||
return [NSError errorWithDomain:MCErrorDomain code:MCErrorWriteFailCode userInfo:@{
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -7,13 +7,38 @@
|
||||
//
|
||||
|
||||
#import "MCCapeCellView.h"
|
||||
#import "MCCapePreviewItem.h"
|
||||
|
||||
@interface MCCapeCellView ()
|
||||
@end
|
||||
|
||||
@interface MCSortValueTransformer : NSValueTransformer
|
||||
@end
|
||||
|
||||
@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:@{ NSValueTransformerBindingOption: [MCSortValueTransformer new] }];
|
||||
|
||||
//
|
||||
self.collectionView.minItemSize = self.collectionView.itemPrototype.view.frame.size;
|
||||
self.collectionView.maxItemSize = self.collectionView.minItemSize;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[self.collectionView unbind:NSContentBinding];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation MCSortValueTransformer
|
||||
|
||||
+ (Class)transformedValueClass {
|
||||
return [NSSet class];
|
||||
}
|
||||
|
||||
- (NSArray *)transformedValue:(NSSet *)value {
|
||||
return [value sortedArrayUsingDescriptors: @[ [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)] ]];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -21,13 +46,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, weak) IBOutlet MMAnimatingImageView *animatingImageView;
|
||||
@end
|
||||
@@ -0,0 +1,45 @@
|
||||
//
|
||||
// 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];
|
||||
[self.animatingImageView bind:@"shouldFlipHorizontally"
|
||||
toObject:[NSUserDefaults standardUserDefaults]
|
||||
withKeyPath:MCPreferencesHandednessKey
|
||||
options:nil];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[self.animatingImageView unbind:@"shouldFlipHorizontally"];
|
||||
[self.animatingImageView unbind:@"image"];
|
||||
[self.animatingImageView unbind:@"frameCount"];
|
||||
[self.animatingImageView unbind:@"frameDuration"];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -33,7 +33,9 @@
|
||||
@property (assign) NSInteger frameCount;
|
||||
@property (assign) CGFloat scale; // set to 0.0 if you want to inherit window scale
|
||||
@property (assign) NSPoint hotSpot;
|
||||
@property (assign) BOOL shouldFlipHorizontally;
|
||||
@property (weak) IBOutlet id <MMAnimatingImageViewDelegate> delegate;
|
||||
@property (assign) BOOL shouldAnimate;
|
||||
@property (assign) BOOL shouldShowHotSpot;
|
||||
@property (assign) BOOL shouldAllowDragging;
|
||||
@end
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
#import "MMAnimatingImageView.h"
|
||||
#import "MCSpriteLayer.h"
|
||||
|
||||
#define SHOULDCOPY NSEvent.modifierFlags & NSAlternateKeyMask
|
||||
|
||||
const char MCInvalidateContext;
|
||||
|
||||
@interface MMAnimatingImageView ()
|
||||
@@ -17,7 +19,9 @@ const char MCInvalidateContext;
|
||||
- (void)_initialize;
|
||||
- (void)_invalidateFrame;
|
||||
- (void)_invalidateAnimation;
|
||||
- (void)_resetTransform;
|
||||
- (void)registerTypes;
|
||||
- (void)_dragAnimationEnded:(id)sender;
|
||||
@end
|
||||
|
||||
@implementation MMAnimatingImageView
|
||||
@@ -47,7 +51,7 @@ const char MCInvalidateContext;
|
||||
|
||||
- (void)_initialize {
|
||||
self.shouldAnimate = YES;
|
||||
|
||||
|
||||
[self registerTypes];
|
||||
|
||||
self.layer = [[MCSpriteLayer alloc] init];
|
||||
@@ -58,15 +62,20 @@ const char MCInvalidateContext;
|
||||
self.layer.delegate = self;
|
||||
|
||||
CALayer *hotSpotLayer = [CALayer layer];
|
||||
hotSpotLayer.bounds = CGRectMake(0, 0, 4, 4);
|
||||
hotSpotLayer.bounds = CGRectMake(0, 0, 3, 3);
|
||||
hotSpotLayer.backgroundColor = [[NSColor redColor] CGColor];
|
||||
hotSpotLayer.autoresizingMask = kCALayerNotSizable;
|
||||
hotSpotLayer.anchorPoint = CGPointMake(0, 0);
|
||||
hotSpotLayer.anchorPoint = CGPointMake(0.5, 0.5);
|
||||
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;
|
||||
|
||||
@@ -76,6 +85,7 @@ const char MCInvalidateContext;
|
||||
[self addObserver:self forKeyPath:@"frameCount" options:0 context:(void *)&MCInvalidateContext];
|
||||
[self addObserver:self forKeyPath:@"frameDuration" options:0 context:(void *)&MCInvalidateContext];
|
||||
[self addObserver:self forKeyPath:@"shouldAnimate" options:0 context:NULL];
|
||||
[self addObserver:self forKeyPath:@"shouldFlipHorizontally" options:0 context:NULL];
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
@@ -85,22 +95,25 @@ const char MCInvalidateContext;
|
||||
[self removeObserver:self forKeyPath:@"frameCount"];
|
||||
[self removeObserver:self forKeyPath:@"frameDuration"];
|
||||
[self removeObserver:self forKeyPath:@"shouldAnimate"];
|
||||
[self removeObserver:self forKeyPath:@"shouldFlipHorizontally"];
|
||||
}
|
||||
|
||||
- (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];
|
||||
} else if ([keyPath isEqualToString:@"shouldAnimate"]) {
|
||||
[self _invalidateAnimation];
|
||||
} else if ([keyPath isEqualToString:@"shouldFlipHorizontally"]) {
|
||||
[self _resetTransform];
|
||||
}
|
||||
}
|
||||
|
||||
- (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
|
||||
@@ -126,24 +139,44 @@ const char MCInvalidateContext;
|
||||
|
||||
#pragma mark - Invalidators
|
||||
|
||||
- (void)_resetTransform {
|
||||
if (self.shouldFlipHorizontally) {
|
||||
self.layer.transform = CATransform3DMakeAffineTransform(CGAffineTransformMake(-1, 0, 0, 1, self.layer.bounds.size.width, 0));
|
||||
} else {
|
||||
self.layer.transform = CATransform3DIdentity;
|
||||
}
|
||||
}
|
||||
|
||||
- (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));
|
||||
|
||||
self.hotSpotLayer.position = CGPointMake(ceil(CGRectGetMinX(effectiveRect) + self.hotSpot.x - self.hotSpotLayer.frame.size.width / 2), ceil(CGRectGetMinY(effectiveRect) - self.hotSpot.y - self.hotSpotLayer.frame.size.height / 2));
|
||||
self.hotSpotLayer.position = CGPointMake(CGRectGetMinX(effectiveRect) + self.hotSpot.x, CGRectGetMinY(effectiveRect) - self.hotSpot.y);
|
||||
self.hotSpotLayer.opacity = 1.0;
|
||||
} else {
|
||||
self.hotSpotLayer.opacity = 0.0;
|
||||
}
|
||||
|
||||
[self _resetTransform];
|
||||
}
|
||||
|
||||
- (void)_invalidateAnimation {
|
||||
@@ -171,42 +204,57 @@ const char MCInvalidateContext;
|
||||
|
||||
#pragma mark - NSDraggingSource
|
||||
|
||||
- (void)draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint {
|
||||
}
|
||||
|
||||
- (NSDragOperation)draggingSession:(NSDraggingSession *)session sourceOperationMaskForDraggingContext:(NSDraggingContext)context {
|
||||
if (context == NSDraggingContextWithinApplication)
|
||||
if (context == NSDraggingContextWithinApplication && self.shouldAllowDragging)
|
||||
return NSDragOperationCopy;
|
||||
if (self.shouldAllowDragging)
|
||||
return NSDragOperationEvery;
|
||||
return NSDragOperationNone;
|
||||
}
|
||||
|
||||
- (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);
|
||||
[self.delegate imageView:self didDragOutImage:self.image];
|
||||
if (!NSPointInRect(screenPoint, self.window.frame)) {
|
||||
if (SHOULDCOPY) {
|
||||
[self _dragAnimationEnded:self];
|
||||
} else if (self.delegate && [self.delegate respondsToSelector:@selector(imageView:didDragOutImage:)]) {
|
||||
NSShowAnimationEffect(NSAnimationEffectPoof, screenPoint, NSZeroSize, self, @selector(_dragAnimationEnded:), nil);
|
||||
[self.delegate imageView:self didDragOutImage:self.image];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_dragAnimationEnded:(id)sender {
|
||||
[[NSCursor arrowCursor] set];
|
||||
}
|
||||
|
||||
- (void)draggingSession:(NSDraggingSession *)session movedToPoint:(NSPoint)screenPoint {
|
||||
if (!NSPointInRect(screenPoint, self.window.frame)) {
|
||||
[[NSCursor disappearingItemCursor] push];
|
||||
if (SHOULDCOPY)
|
||||
[[NSCursor dragCopyCursor] set];
|
||||
else
|
||||
[[NSCursor disappearingItemCursor] set];
|
||||
} else if ([NSCursor currentCursor] == [NSCursor disappearingItemCursor]) {
|
||||
[[NSCursor currentCursor] pop];
|
||||
[self _dragAnimationEnded:self];
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)ignoreModifierKeysForDraggingSession:(NSDraggingSession *)session {
|
||||
return YES;
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (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];
|
||||
[pbItem setDataProvider:self forTypes:@[ NSPasteboardTypePNG, NSPasteboardTypeTIFF, @"public.image" ]];
|
||||
[pbItem setDataProvider:self forTypes:@[ NSPasteboardTypePNG, NSPasteboardTypeTIFF, @"public.image", (__bridge NSString *)kPasteboardTypeFileURLPromise ]];
|
||||
|
||||
NSDraggingItem *dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter:pbItem];
|
||||
|
||||
@@ -229,12 +277,15 @@ const char MCInvalidateContext;
|
||||
- (void)pasteboard:(NSPasteboard *)sender item:(NSPasteboardItem *)item provideDataForType:(NSString *)type {
|
||||
if ([type compare: NSPasteboardTypeTIFF] == NSOrderedSame) {
|
||||
[sender setData:[self.image TIFFRepresentation] forType:NSPasteboardTypeTIFF];
|
||||
|
||||
} else if ([type compare: NSPasteboardTypePNG] == NSOrderedSame) {
|
||||
[sender setData:[self.image.representations.lastObject representationUsingType:NSPNGFileType properties:nil] forType:NSPasteboardTypePNG];
|
||||
} else if ([type compare:@"public.image"] == NSOrderedSame) {
|
||||
[sender writeObjects:@[ self.image ]];
|
||||
} else if ([type compare:(__bridge NSString *)kPasteboardTypeFileURLPromise] == NSOrderedSame && SHOULDCOPY) {
|
||||
NSURL *url = [[NSURL URLWithString:[item stringForType:@"com.apple.pastelocation"]] URLByAppendingPathComponent:[NSString stringWithFormat:@"Mousecape Image (%f).png", NSDate.date.timeIntervalSince1970]];
|
||||
[[self.image.representations.firstObject representationUsingType:NSPNGFileType properties:nil] writeToFile:url.path atomically:NO];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#pragma mark - NSDragDestination
|
||||
@@ -246,15 +297,16 @@ 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
|
||||
return [self.delegate imageView:self draggingEntered:sender];
|
||||
self.shouldAllowDragging) {
|
||||
return [self.delegate imageView:self draggingEntered:sender];
|
||||
}
|
||||
|
||||
return NSDragOperationNone;
|
||||
}
|
||||
|
||||
// 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;
|
||||
@@ -263,27 +315,28 @@ const char MCInvalidateContext;
|
||||
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
|
||||
if ([self.delegate conformsToProtocol:@protocol(MMAnimatingImageViewDelegate)] && // Only do the operation if a delegate exists to actually set the image.
|
||||
[self.delegate imageView:self shouldPerformDragOperation:sender]) { // Only do the operation if a delegate wants us to do the operation.
|
||||
|
||||
|
||||
// Get the image from the pasteboard
|
||||
NSImage *im = [[NSImage alloc] initWithPasteboard:sender.draggingPasteboard];
|
||||
|
||||
// Make an array of the valid drops (NSBitmapImageRep)
|
||||
NSMutableArray *acceptedDrops = [NSMutableArray arrayWithCapacity:im.representations.count];
|
||||
for (NSImageRep *rep in im.representations) {
|
||||
if (![rep isKindOfClass:[NSBitmapImageRep class]]) // We don't want PDFs
|
||||
continue;
|
||||
|
||||
[acceptedDrops addObject:rep];
|
||||
|
||||
}
|
||||
NSArray *imageArray = [sender.draggingPasteboard readObjectsForClasses:@[[NSImage class], [NSURL class]] options:nil];
|
||||
NSMutableArray *acceptedDrops = [NSMutableArray arrayWithCapacity:imageArray.count];
|
||||
for (NSInteger idx = 0; idx < imageArray.count; idx++) {
|
||||
id obj = imageArray[idx];
|
||||
if ([obj isKindOfClass:[NSImage class]]) {
|
||||
[acceptedDrops addObject:[[obj representations] firstObject]];
|
||||
} else {
|
||||
// NSURL
|
||||
[acceptedDrops addObject:[NSImageRep imageRepWithContentsOfURL:obj]];
|
||||
}
|
||||
}
|
||||
|
||||
if (acceptedDrops.count > 0) {
|
||||
// We already confirmed that the delegate conforms to the protocol above. Now we can let the delegate
|
||||
// decide what to do with the dropped images.
|
||||
[self.delegate imageView:self didAcceptDroppedImages:acceptedDrops];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
return NO;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -69,4 +69,7 @@ extern NSDictionary *capeWithIdentifier(NSString *identifier);
|
||||
extern void CGImageWriteToFile(CGImageRef image, CFStringRef path);
|
||||
extern NSData *pngDataForImage(id image);
|
||||
extern NSString *MMGet();
|
||||
|
||||
extern CGError MCIsCursorRegistered(CGSConnectionID cid, char *cursorName, bool *registered);
|
||||
extern BOOL MCCursorIsPointer(NSString *identifier);
|
||||
#endif
|
||||
|
||||
@@ -109,17 +109,18 @@ NSDictionary *capeWithIdentifier(NSString *identifier) {
|
||||
CFArrayRef representations;
|
||||
bool registered = false;
|
||||
|
||||
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)identifier.UTF8String, ®istered);
|
||||
MCIsCursorRegistered(CGSMainConnectionID(), (char *)identifier.UTF8String, ®istered);
|
||||
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};
|
||||
@@ -129,7 +130,7 @@ NSDictionary *capeWithIdentifier(NSString *identifier) {
|
||||
return dict;
|
||||
}
|
||||
|
||||
NSDictionary *cursorMap() {
|
||||
extern NSDictionary *cursorMap() {
|
||||
static NSDictionary *cursorNameMap = nil;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
@@ -200,3 +201,28 @@ NSString *cursorIdentifierForName(NSString *name) {
|
||||
return keys[0];
|
||||
return UUID();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
BOOL MCCursorIsPointer(NSString *identifier) {
|
||||
static NSArray *pointers = nil;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
NSDictionary *c = cursorMap();
|
||||
pointers = [@[ [c allKeysForObject:@"Alias"][0], [c allKeysForObject:@"Arrow"][0], [c allKeysForObject:@"Busy"][0], [c allKeysForObject:@"Closed"][0], [c allKeysForObject:@"Copy Drag"][0], [c allKeysForObject:@"Counting Down"][0], [c allKeysForObject:@"Counting Up"][0], [c allKeysForObject:@"Counting Up/Down"][0], [c allKeysForObject:@"Ctx Menu"][0], [c allKeysForObject:@"Forbidden"][0], [c allKeysForObject:@"Link"][0], [c allKeysForObject:@"Move"][0], [c allKeysForObject:@"Open"][0], [c allKeysForObject:@"Pointing"][0], [c allKeysForObject:@"Poof"][0], [c allKeysForObject:@"Wait"][0], [c allKeysForObject:@"Zoom In"][0], [c allKeysForObject:@"Zoom Out"] ] retain];
|
||||
});
|
||||
|
||||
return [pointers containsObject:identifier];
|
||||
}
|
||||
|
||||
@@ -15,10 +15,11 @@ extern NSString *MCPreferencesAppliedCursorKey;
|
||||
extern NSString *MCPreferencesAppliedClickActionKey;
|
||||
extern NSString *MCPreferencesCursorScaleKey;
|
||||
extern NSString *MCPreferencesDoubleActionKey;
|
||||
extern NSString *MCPreferencesHandednessKey;
|
||||
extern NSString *MCSuppressDeleteLibraryConfirmationKey;
|
||||
extern NSString *MCSuppressDeleteCursorConfirmationKey;
|
||||
extern id MCDefaultFor(NSString *key, NSString *user, NSString *host);
|
||||
#define MCDefault(key) MCDefaultFor(key, (__bridge NSString *)kCFPreferencesCurrentUser, (__bridge NSString *)kCFPreferencesCurrentHost)
|
||||
extern id MCDefault(NSString *key);
|
||||
#define MCFlag(key) [MCDefault(key) boolValue]
|
||||
|
||||
extern void MCSetDefaultFor(id value, NSString *key, NSString *user, NSString *host);
|
||||
|
||||
@@ -12,6 +12,7 @@ NSString *MCPreferencesAppliedCursorKey = @"MCAppliedCursor";
|
||||
NSString *MCPreferencesAppliedClickActionKey = @"MCLibraryClickAction";
|
||||
NSString *MCPreferencesCursorScaleKey = @"MCCursorScale";
|
||||
NSString *MCPreferencesDoubleActionKey = @"MCDoubleAction";
|
||||
NSString *MCPreferencesHandednessKey = @"MCHandedness";
|
||||
NSString *MCSuppressDeleteLibraryConfirmationKey = @"MCSuppressDeleteLibraryConfirmationKey";
|
||||
NSString *MCSuppressDeleteCursorConfirmationKey = @"MCSuppressDeleteCursorConfirmationKey";
|
||||
id MCDefaultFor(NSString *key, NSString *user, NSString *host) {
|
||||
@@ -19,8 +20,12 @@ id MCDefaultFor(NSString *key, NSString *user, NSString *host) {
|
||||
return [value autorelease];
|
||||
}
|
||||
|
||||
void MCSetDefaultFor(id value, NSString *key, NSString *user, NSString *host) {
|
||||
CFPreferencesSetValue((CFStringRef)key, (CFPropertyListRef)value, (CFStringRef)kMCDomain, (CFStringRef)user, (CFStringRef)host);
|
||||
// CFPreferencesSynchronize((CFStringRef)kMCDomain, (CFStringRef)user, (CFStringRef)host);
|
||||
id MCDefault(NSString *key) {
|
||||
return [(id)CFPreferencesCopyAppValue((CFStringRef)key, (CFStringRef)kMCDomain) autorelease];
|
||||
}
|
||||
|
||||
void MCSetDefaultFor(id value, NSString *key, NSString *user, NSString *host) {
|
||||
CFPreferencesSetValue((CFStringRef)key, (CFPropertyListRef)value, (CFStringRef)kMCDomain, (CFStringRef)user, (CFStringRef)host);
|
||||
// CFPreferencesSynchronize((CFStringRef)kMCDomain, (CFStringRef)user, (CFStringRef)host);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#define Mousecape_apply_h
|
||||
|
||||
extern BOOL applyCursorForIdentifier(NSUInteger frameCount, CGFloat frameDuration, CGPoint hotSpot, CGSize size, NSArray *images, NSString *ident, NSUInteger repeatCount);
|
||||
extern BOOL applyCapeForIdentifier(NSDictionary *cursor, NSString *identifier);
|
||||
extern BOOL applyCapeForIdentifier(NSDictionary *cursor, NSString *identifier, BOOL restore);
|
||||
extern BOOL applyCape(NSDictionary *dictionary);
|
||||
extern BOOL applyCapeAtPath(NSString *path);
|
||||
|
||||
|
||||
@@ -35,10 +35,14 @@ BOOL applyCursorForIdentifier(NSUInteger frameCount, CGFloat frameDuration, CGPo
|
||||
return (err == kCGErrorSuccess);
|
||||
}
|
||||
|
||||
BOOL applyCapeForIdentifier(NSDictionary *cursor, NSString *identifier) {
|
||||
if (!cursor)
|
||||
BOOL applyCapeForIdentifier(NSDictionary *cursor, NSString *identifier, BOOL restore) {
|
||||
if (!cursor || !identifier) {
|
||||
NSLog(@"bad seed");
|
||||
return NO;
|
||||
|
||||
}
|
||||
|
||||
BOOL lefty = MCFlag(MCPreferencesHandednessKey);
|
||||
BOOL pointer = MCCursorIsPointer(identifier);
|
||||
NSNumber *frameCount = cursor[MCCursorDictionaryFrameCountKey];
|
||||
NSNumber *frameDuration = cursor[MCCursorDictionaryFrameDuratiomKey];
|
||||
// NSNumber *repeatCount = cursor[MCCursorDictionaryRepeatCountKey];
|
||||
@@ -48,27 +52,66 @@ BOOL applyCapeForIdentifier(NSDictionary *cursor, NSString *identifier) {
|
||||
CGSize size = CGSizeMake([cursor[MCCursorDictionaryPointsWideKey] doubleValue],
|
||||
[cursor[MCCursorDictionaryPointsHighKey] doubleValue]);
|
||||
NSArray *reps = cursor[MCCursorDictionaryRepresentationsKey];
|
||||
|
||||
NSMutableArray *images = [NSMutableArray array];
|
||||
|
||||
|
||||
if (lefty && !restore && pointer) {
|
||||
MMLog("Lefty mode for %s", identifier.UTF8String);
|
||||
hotSpot.x = size.width - hotSpot.x - 1;
|
||||
}
|
||||
|
||||
for (id object in reps) {
|
||||
CFTypeID type = CFGetTypeID((__bridge CFTypeRef)object);
|
||||
|
||||
// special case if array has a type of CGImage already there is no need to convert it
|
||||
if (type == CGImageGetTypeID()) {
|
||||
images[images.count] = object;
|
||||
continue;
|
||||
|
||||
if (!lefty || restore || !pointer) {
|
||||
// special case if array has a type of CGImage already there is no need to convert it
|
||||
if (type == CGImageGetTypeID()) {
|
||||
images[images.count] = object;
|
||||
continue;
|
||||
}
|
||||
|
||||
CFDataRef pngData = (__bridge CFDataRef)object;
|
||||
CGDataProviderRef pngProvider = CGDataProviderCreateWithCFData(pngData);
|
||||
CGImageRef rep = CGImageCreateWithPNGDataProvider(pngProvider, NULL, false, kCGRenderingIntentDefault);
|
||||
CGDataProviderRelease(pngProvider);
|
||||
|
||||
images[images.count] = (__bridge id)rep;
|
||||
|
||||
CGImageRelease(rep);
|
||||
} else {
|
||||
NSBitmapImageRep *rep;
|
||||
if (type == CGImageGetTypeID()) {
|
||||
rep = [[NSBitmapImageRep alloc] initWithCGImage:(__bridge CGImageRef)object];
|
||||
} else {
|
||||
rep = [[NSBitmapImageRep alloc] initWithData:object];
|
||||
}
|
||||
|
||||
NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
|
||||
pixelsWide:rep.pixelsWide
|
||||
pixelsHigh:rep.pixelsHigh
|
||||
bitsPerSample:8
|
||||
samplesPerPixel:4
|
||||
hasAlpha:YES
|
||||
isPlanar:NO
|
||||
colorSpaceName:NSDeviceRGBColorSpace
|
||||
bytesPerRow:4 * rep.pixelsWide
|
||||
bitsPerPixel:32];
|
||||
NSGraphicsContext *ctx = [NSGraphicsContext graphicsContextWithBitmapImageRep:newRep];
|
||||
[NSGraphicsContext saveGraphicsState];
|
||||
[NSGraphicsContext setCurrentContext:ctx];
|
||||
NSAffineTransform *transform = [NSAffineTransform transform];
|
||||
[transform translateXBy:rep.pixelsWide yBy:0];
|
||||
[transform scaleXBy:-1 yBy:1];
|
||||
[transform concat];
|
||||
|
||||
[rep drawInRect:NSMakeRect(0, 0, rep.pixelsWide, rep.pixelsHigh)
|
||||
fromRect:NSZeroRect
|
||||
operation:NSCompositeSourceOver
|
||||
fraction:1.0
|
||||
respectFlipped:NO
|
||||
hints:nil];
|
||||
[NSGraphicsContext restoreGraphicsState];
|
||||
images[images.count] = (__bridge id)[newRep CGImage];
|
||||
}
|
||||
|
||||
CFDataRef pngData = (__bridge CFDataRef)object;
|
||||
|
||||
CGDataProviderRef pngProvider = CGDataProviderCreateWithCFData(pngData);
|
||||
CGImageRef rep = CGImageCreateWithPNGDataProvider(pngProvider, NULL, false, kCGRenderingIntentDefault);
|
||||
CGDataProviderRelease(pngProvider);
|
||||
|
||||
images[images.count] = (__bridge id)rep;
|
||||
|
||||
CGImageRelease(rep);
|
||||
}
|
||||
|
||||
return applyCursorForIdentifier(frameCount.unsignedIntegerValue, frameDuration.doubleValue, hotSpot, size, images, identifier, 0);
|
||||
@@ -89,7 +132,7 @@ BOOL applyCape(NSDictionary *dictionary) {
|
||||
NSDictionary *cape = cursors[key];
|
||||
MMLog("Hooking for %s", key.UTF8String);
|
||||
|
||||
BOOL success = applyCapeForIdentifier(cape, key);
|
||||
BOOL success = applyCapeForIdentifier(cape, key, NO);
|
||||
if (!success) {
|
||||
MMLog(BOLD RED "Failed to hook identifier %s for some unknown reason. Bailing out..." RESET, key.UTF8String);
|
||||
return NO;
|
||||
|
||||
@@ -15,31 +15,31 @@ NSString *backupStringForIdentifier(NSString *identifier) {
|
||||
|
||||
void backupCursorForIdentifier(NSString *ident) {
|
||||
bool registered = false;
|
||||
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)ident.UTF8String, ®istered);
|
||||
MCIsCursorRegistered(CGSMainConnectionID(), (char *)ident.UTF8String, ®istered);
|
||||
|
||||
// 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, ®istered);
|
||||
MCIsCursorRegistered(CGSMainConnectionID(), (char *)backupIdent.UTF8String, ®istered);
|
||||
|
||||
// don't re-back it up
|
||||
// don't re-back it up
|
||||
if (registered)
|
||||
return;
|
||||
|
||||
NSDictionary *cape = capeWithIdentifier(ident);
|
||||
(void)applyCapeForIdentifier(cape, backupIdent);
|
||||
(void)applyCapeForIdentifier(cape, backupIdent, YES);
|
||||
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
@@ -11,9 +11,12 @@
|
||||
extern NSError *createCape(NSString *input, NSString *output, BOOL convert);
|
||||
|
||||
extern NSDictionary *processedCapeWithIdentifier(NSString *identifier);
|
||||
extern void dumpCursorsToFile(NSString *path);
|
||||
extern BOOL dumpCursorsToFile(NSString *path, BOOL (^progress)(NSUInteger current, NSUInteger total));
|
||||
extern BOOL dumpCursorsToFolder(NSString *path, BOOL (^progress)(NSUInteger current, NSUInteger total));
|
||||
|
||||
extern NSDictionary *createCapeFromDirectory(NSString *path);
|
||||
extern NSDictionary *createCapeFromMightyMouse(NSDictionary *mightyMouse, NSDictionary *metadata);
|
||||
|
||||
extern void exportCape(NSDictionary *cape, NSString *destination);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -253,7 +253,7 @@ NSDictionary *processedCapeWithIdentifier(NSString *identifier) {
|
||||
return dict;
|
||||
}
|
||||
|
||||
void dumpCursorsToFile(NSString *path) {
|
||||
BOOL dumpCursorsToFile(NSString *path, BOOL (^progress)(NSUInteger current, NSUInteger total)) {
|
||||
MMLog("Dumping cursors...");
|
||||
|
||||
float originalScale;
|
||||
@@ -261,17 +261,34 @@ void dumpCursorsToFile(NSString *path) {
|
||||
|
||||
CGSSetCursorScale(CGSMainConnectionID(), 16.0);
|
||||
CGSHideCursor(CGSMainConnectionID());
|
||||
|
||||
|
||||
NSInteger total = 9 + 45;
|
||||
NSInteger current = 0;
|
||||
|
||||
NSMutableDictionary *cursors = [NSMutableDictionary dictionary];
|
||||
NSUInteger i = 0;
|
||||
NSString *key = nil;
|
||||
while ((key = defaultCursors[i]) != nil) {
|
||||
if (progress) {
|
||||
current = i;
|
||||
|
||||
if (!progress(current, total)) {
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
MMLog("Gathering data for %s", key.UTF8String);
|
||||
cursors[key] = processedCapeWithIdentifier(key);
|
||||
i++;
|
||||
}
|
||||
|
||||
for (int x = 0x0; x < 0x100; x++) {
|
||||
for (int x = 0; x < 45; x++) {
|
||||
if (progress) {
|
||||
current = i + x;
|
||||
|
||||
if (!progress(current, total)) {
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
NSString *key = [@"com.apple.cursor." stringByAppendingFormat:@"%d", x];
|
||||
CoreCursorSet(CGSMainConnectionID(), x);
|
||||
|
||||
@@ -283,7 +300,11 @@ void dumpCursorsToFile(NSString *path) {
|
||||
|
||||
cursors[key] = cape;
|
||||
}
|
||||
|
||||
|
||||
if (progress) {
|
||||
progress(total, total);
|
||||
}
|
||||
|
||||
NSMutableDictionary *cape = [NSMutableDictionary dictionary];
|
||||
cape[MCCursorDictionaryAuthorKey] = @"Apple, Inc.";
|
||||
cape[MCCursorDictionaryCapeNameKey] = @"Cursor Dump";
|
||||
@@ -298,5 +319,78 @@ void dumpCursorsToFile(NSString *path) {
|
||||
CGSSetCursorScale(CGSMainConnectionID(), originalScale);
|
||||
CGSShowCursor(CGSMainConnectionID());
|
||||
|
||||
[cape writeToFile:path atomically:NO];
|
||||
return [cape writeToFile:path atomically:NO];
|
||||
}
|
||||
|
||||
BOOL dumpCursorsToFolder(NSString *path, BOOL (^progress)(NSUInteger current, NSUInteger total)) {
|
||||
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
|
||||
|
||||
MMLog("Dumping cursors...");
|
||||
|
||||
float originalScale;
|
||||
CGSGetCursorScale(CGSMainConnectionID(), &originalScale);
|
||||
|
||||
CGSSetCursorScale(CGSMainConnectionID(), 16.0);
|
||||
CGSHideCursor(CGSMainConnectionID());
|
||||
|
||||
NSInteger total = 9 + 45;
|
||||
NSInteger current = 0;
|
||||
|
||||
NSUInteger i = 0;
|
||||
NSString *key = nil;
|
||||
while ((key = defaultCursors[i]) != nil) {
|
||||
current = i;
|
||||
if (progress) {
|
||||
if (!progress(current, total)) {
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
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 = 0; x < 45; x++) {
|
||||
current = i + x;
|
||||
if (progress) {
|
||||
if (!progress(current, total)) {
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
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];
|
||||
}
|
||||
|
||||
if (progress) {
|
||||
progress(total, total);
|
||||
}
|
||||
|
||||
CGSSetCursorScale(CGSMainConnectionID(), originalScale);
|
||||
CGSShowCursor(CGSMainConnectionID());
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
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];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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,8 +150,21 @@ 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"]);
|
||||
dumpCursorsToFile([settings objectForKey:@"dump"], ^BOOL (NSUInteger progress, NSUInteger total) {
|
||||
MMLog("Dumped %lu of %lu", (unsigned long)progress, (unsigned long)total);
|
||||
return YES;
|
||||
});
|
||||
} else if (scale) {
|
||||
NSNumber *number = [settings objectForKey:@"scale"];
|
||||
|
||||
|
||||
@@ -16,16 +16,16 @@ NSString *restoreStringForIdentifier(NSString *identifier) {
|
||||
|
||||
void restoreCursorForIdentifier(NSString *ident) {
|
||||
bool registered = false;
|
||||
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)ident.UTF8String, ®istered);
|
||||
|
||||
MCIsCursorRegistered(CGSMainConnectionID(), (char *)ident.UTF8String, ®istered);
|
||||
|
||||
NSString *restoreIdent = restoreStringForIdentifier(ident);
|
||||
NSDictionary *cape = capeWithIdentifier(ident);
|
||||
|
||||
MMLog("Restoring cursor %s from %s", restoreIdent.UTF8String, ident.UTF8String);
|
||||
if (cape && registered) {
|
||||
applyCapeForIdentifier(cape, restoreIdent);
|
||||
applyCapeForIdentifier(cape, restoreIdent, YES);
|
||||
}
|
||||
|
||||
|
||||
CGSRemoveRegisteredCursor(CGSMainConnectionID(), (char *)ident.UTF8String, false);
|
||||
}
|
||||
|
||||
|
||||
+12
-2
@@ -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>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -19,13 +19,17 @@ There is an example cape file included in this Git Repo located [here for downlo
|
||||
|
||||
You can create a new cape document in the Mousecape app by hitting ⌘N (Command-N) and editing it with ⌘E. Click the "+" button to add cursors to customize and symply drag your images into the fields provided.
|
||||
|
||||
## How do animated cursors work?
|
||||
|
||||
When you want to animate a cursor, change the value in the frames field in the edit window and make sure frame duration is how you want it. Next, create an image that has all of your cursor frames stacked on top of each other vertically. Mousecape will traverse down the image for each frame, using a box the same size as whatever you put in the size field.
|
||||
|
||||
## How can I say thanks?
|
||||
|
||||
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.5**.
|
||||
|
||||
## LICENSE
|
||||
|
||||
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<channel>
|
||||
<title>Mousecape Changelog</title>
|
||||
<link>https://raw.githubusercontent.com/alexzielenski/Mousecape/master/appcast.xml</link>
|
||||
<description>Most recent changes with links to updates.</description>
|
||||
<language>en</language>
|
||||
<item>
|
||||
<title>Version 0.0.5</title>
|
||||
<description>
|
||||
<![CDATA[
|
||||
<ul>
|
||||
<li>New information in read me on how to animate cursors</li>
|
||||
<li>[New] Ability to export cursors by holding the alt key when dragging from the edit window</li>
|
||||
<li>[New] Ability to dump currently applied cursors from Capes menu</li>
|
||||
<li>[Fix] Checking for existing identifiers already in library</li>
|
||||
<li>[Fix] Inaccurate hotspot dot in edit window</li>
|
||||
<li>[New] First image dragged in to edit window drop zone defines the cursor size</li>
|
||||
<li>[New] Drag in multiple images of the same size to animate</li>
|
||||
<li>[New] Holt alt key while dragging a cursor image in to add it as a frame</li>
|
||||
<li>[Fix] Adding a cursor to the library by opening it without the app open</li>
|
||||
<li>[Fix] Identifier renames not being saved</li>
|
||||
<li>[New] Sort cursors within a cape by name in library window</li>
|
||||
<li>[New] Preference for left-handed users that flips all pointer images</li>
|
||||
</ul>
|
||||
]]>
|
||||
</description>
|
||||
<pubDate>Sat, 26 Jul 2014 15:20:11 +0000</pubDate>
|
||||
<enclosure url="https://github.com/alexzielenski/Mousecape/releases/download/0.0.5/Mousecape.zip" sparkle:version="1579" sparkle:shortVersionString="0.0.5" length="269044" type="application/octet-stream" />
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
Reference in New Issue
Block a user