Compare commits
87 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c946d78130 | |||
| d414d175a7 | |||
| 6bf1080f82 | |||
| b96acc8353 | |||
| 487c9aa91d | |||
| 706e546a1a | |||
| 77577c0fb9 | |||
| e136fd9b96 | |||
| 2364dd5348 | |||
| 1859b11eb8 | |||
| 3a180d52cf | |||
| 21626bfc19 | |||
| 35410babdf | |||
| c467ecee85 | |||
| 9a38e4e877 | |||
| cdd2bba2cc | |||
| f64cbde808 | |||
| 88291b8bda | |||
| 57e3af4583 | |||
| db26ffe28a | |||
| 1d33808cb9 | |||
| b570903bce | |||
| 5411d094ff | |||
| 1d534b1e07 | |||
| ad75161d07 | |||
| 4dc5130995 | |||
| d9f935e76f | |||
| 1d3eaf94b1 | |||
| b2bf822f76 | |||
| 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 | |||
| e46da350ca | |||
| 413703dc28 | |||
| 9f136aa868 | |||
| 77f34d1c8d | |||
| bf48139233 | |||
| fc19c53f67 |
@@ -0,0 +1,69 @@
|
||||
WorkspaceSettings.xcsettings
|
||||
# Xcode
|
||||
#
|
||||
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
|
||||
|
||||
## User settings
|
||||
xcuserdata/
|
||||
|
||||
## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
|
||||
*.xcscmblueprint
|
||||
*.xccheckout
|
||||
|
||||
## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
|
||||
build/
|
||||
DerivedData/
|
||||
*.moved-aside
|
||||
*.pbxuser
|
||||
!default.pbxuser
|
||||
*.mode1v3
|
||||
!default.mode1v3
|
||||
*.mode2v3
|
||||
!default.mode2v3
|
||||
*.perspectivev3
|
||||
!default.perspectivev3
|
||||
|
||||
## Obj-C/Swift specific
|
||||
*.hmap
|
||||
|
||||
## App packaging
|
||||
*.ipa
|
||||
*.dSYM.zip
|
||||
*.dSYM
|
||||
|
||||
# CocoaPods
|
||||
#
|
||||
# We recommend against adding the Pods directory to your .gitignore. However
|
||||
# you should judge for yourself, the pros and cons are mentioned at:
|
||||
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
|
||||
#
|
||||
# Pods/
|
||||
#
|
||||
# Add this line if you want to avoid checking in source code from the Xcode workspace
|
||||
# *.xcworkspace
|
||||
|
||||
# Carthage
|
||||
#
|
||||
# Add this line if you want to avoid checking in source code from Carthage dependencies.
|
||||
# Carthage/Checkouts
|
||||
|
||||
Carthage/Build/
|
||||
|
||||
# fastlane
|
||||
#
|
||||
# It is recommended to not store the screenshots in the git repo.
|
||||
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
|
||||
# For more information about the recommended setup visit:
|
||||
# https://docs.fastlane.tools/best-practices/source-control/#source-control
|
||||
|
||||
fastlane/report.xml
|
||||
fastlane/Preview.html
|
||||
fastlane/screenshots/**/*.png
|
||||
fastlane/test_output
|
||||
|
||||
# Code Injection
|
||||
#
|
||||
# After new code Injection tools there's a generated folder /iOSInjectionProject
|
||||
# https://github.com/johnno1962/injectionforxcode
|
||||
|
||||
iOSInjectionProject/
|
||||
@@ -0,0 +1,3 @@
|
||||
[submodule "Mousecape/Mousecape/external/Sparkle"]
|
||||
path = Mousecape/Mousecape/external/Sparkle
|
||||
url = https://github.com/sparkle-project/Sparkle.git
|
||||
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Bucket
|
||||
type = "1"
|
||||
version = "2.0">
|
||||
</Bucket>
|
||||
@@ -1,96 +0,0 @@
|
||||
<?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 = "Debug"
|
||||
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>
|
||||
@@ -1,86 +0,0 @@
|
||||
<?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 = "FAC69FAC189D608900BC829D"
|
||||
BuildableName = "mousecloak"
|
||||
BlueprintName = "mousecloak"
|
||||
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 = "FAC69FAC189D608900BC829D"
|
||||
BuildableName = "mousecloak"
|
||||
BlueprintName = "mousecloak"
|
||||
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 = "FAC69FAC189D608900BC829D"
|
||||
BuildableName = "mousecloak"
|
||||
BlueprintName = "mousecloak"
|
||||
ReferencedContainer = "container:Mousecape.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
buildConfiguration = "Release"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "FAC69FAC189D608900BC829D"
|
||||
BuildableName = "mousecloak"
|
||||
BlueprintName = "mousecloak"
|
||||
ReferencedContainer = "container:Mousecape.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -1,42 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>SchemeUserState</key>
|
||||
<dict>
|
||||
<key>Mousecape.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>mousecloak.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
<dict>
|
||||
<key>FAC69F60189D603C00BC829D</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>FAC69F81189D603C00BC829D</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>FAC69F9B189D605300BC829D</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>FAC69FAC189D608900BC829D</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,8 +1,9 @@
|
||||
<?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">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="16096" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<deployment defaultVersion="1080" identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="16096"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="MCEditWindowController">
|
||||
@@ -15,41 +16,38 @@
|
||||
</connections>
|
||||
</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">
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="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"/>
|
||||
<value key="minSize" type="size" width="500" height="310"/>
|
||||
<rect key="contentRect" x="196" y="240" width="525" height="296"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
|
||||
<value key="minSize" type="size" width="500" height="296"/>
|
||||
<view key="contentView" id="2">
|
||||
<rect key="frame" x="0.0" y="0.0" width="525" height="297"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="525" height="296"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<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"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="525" height="296"/>
|
||||
<subviews>
|
||||
<customView id="IHY-vi-Wpr">
|
||||
<rect key="frame" x="0.0" y="0.0" width="135" height="297"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="135" height="296"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<scrollView canDrawConcurrently="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" 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">
|
||||
<rect key="frame" x="0.0" y="0.0" width="135" height="275"/>
|
||||
<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="274"/>
|
||||
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="ame-2S-JV7">
|
||||
<rect key="frame" x="0.0" y="0.0" width="135" height="274"/>
|
||||
<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"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<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">
|
||||
<rect key="frame" x="0.0" y="0.0" width="135" height="274"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<size key="intercellSpacing" width="3" height="2"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<tableColumns>
|
||||
<tableColumn editable="NO" width="132" minWidth="40" maxWidth="1000" id="B1d-Yp-OOR">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableHeaderCell>
|
||||
@@ -65,8 +63,7 @@
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<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"/>
|
||||
<rect key="frame" x="6" y="8" width="120" height="16"/>
|
||||
<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"/>
|
||||
@@ -96,8 +93,7 @@
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<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"/>
|
||||
<rect key="frame" x="6" y="1" width="120" height="16"/>
|
||||
<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 +124,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"/>
|
||||
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="ARR-bd-5zK">
|
||||
<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"/>
|
||||
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="3rZ-7d-Mro">
|
||||
<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 +148,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,15 +161,11 @@
|
||||
<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" boxType="separator" 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>
|
||||
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
|
||||
<color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<font key="titleFont" metaFont="system"/>
|
||||
</box>
|
||||
</subviews>
|
||||
<constraints>
|
||||
@@ -192,13 +180,13 @@
|
||||
<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>
|
||||
<customView fixedFrame="YES" id="fzz-Li-KC6">
|
||||
<rect key="frame" x="136" y="0.0" width="389" height="297"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<rect key="frame" x="136" y="0.0" width="389" height="296"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
</customView>
|
||||
</subviews>
|
||||
<holdingPriorities>
|
||||
@@ -221,6 +209,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>
|
||||
@@ -248,8 +237,7 @@
|
||||
<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"/>
|
||||
<rect key="frame" x="18" y="261" width="62" height="16"/>
|
||||
<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"/>
|
||||
@@ -257,8 +245,7 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="18" y="213" width="62" height="16"/>
|
||||
<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"/>
|
||||
@@ -266,8 +253,7 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="18" y="237" width="62" height="16"/>
|
||||
<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"/>
|
||||
@@ -275,8 +261,7 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="18" y="285" width="62" height="16"/>
|
||||
<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"/>
|
||||
@@ -284,11 +269,10 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="86" y="282" width="398" height="21"/>
|
||||
<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"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
@@ -297,11 +281,10 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="86" y="258" width="398" height="21"/>
|
||||
<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"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
@@ -310,11 +293,10 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="86" y="234" width="398" height="21"/>
|
||||
<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"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
@@ -327,11 +309,10 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="86" y="210" width="398" height="21"/>
|
||||
<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"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
@@ -340,8 +321,7 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="18" y="189" width="62" height="16"/>
|
||||
<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"/>
|
||||
@@ -349,8 +329,7 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="84" y="186" 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"/>
|
||||
@@ -365,6 +344,7 @@
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="leading" secondItem="bim-1a-xuh" secondAttribute="leading" id="0xF-zq-ScD"/>
|
||||
<constraint firstAttribute="trailing" secondItem="XYx-UL-WbM" secondAttribute="trailing" constant="20" id="2FH-UV-gN8"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="width" secondItem="xy3-2B-C0h" secondAttribute="width" id="5Ga-DV-3Po"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="MJr-Jz-5Cq" secondAttribute="trailing" constant="20" symbolic="YES" id="6NT-lK-p2E"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="width" secondItem="XYx-UL-WbM" secondAttribute="width" id="78w-Rp-5Kn"/>
|
||||
<constraint firstItem="bim-1a-xuh" firstAttribute="top" secondItem="WMR-Vn-IHF" secondAttribute="top" constant="18" id="7md-u2-mQL"/>
|
||||
<constraint firstAttribute="trailing" secondItem="car-it-RsL" secondAttribute="trailing" constant="20" id="8og-5G-f3t"/>
|
||||
@@ -396,6 +376,7 @@
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="top" secondItem="XYx-UL-WbM" secondAttribute="bottom" constant="3" id="ol9-vF-CGP"/>
|
||||
<constraint firstItem="MJr-Jz-5Cq" firstAttribute="top" secondItem="car-it-RsL" secondAttribute="bottom" constant="8" id="rTY-Fr-65b"/>
|
||||
<constraint firstItem="CTE-6h-rbf" firstAttribute="width" secondItem="yyn-IO-TkO" secondAttribute="width" id="sb9-dg-qOh"/>
|
||||
<constraint firstItem="i5v-yD-weq" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="WMR-Vn-IHF" secondAttribute="leading" constant="20" symbolic="YES" id="wYl-BB-jBi"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="trailing" secondItem="xy3-2B-C0h" secondAttribute="trailing" id="wpN-fF-mXb"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="trailing" secondItem="bim-1a-xuh" secondAttribute="trailing" id="wtJ-Bc-d9Z"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="leading" secondItem="XYx-UL-WbM" secondAttribute="leading" id="yFH-4V-CiS"/>
|
||||
@@ -403,14 +384,14 @@
|
||||
<connections>
|
||||
<outlet property="nextKeyView" destination="bim-1a-xuh" id="YxQ-sZ-TFh"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="139" y="157"/>
|
||||
</customView>
|
||||
<customView id="o0X-1i-ZgL" userLabel="Detail">
|
||||
<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"/>
|
||||
<rect key="frame" x="18" y="285" width="102" height="16"/>
|
||||
<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"/>
|
||||
@@ -418,8 +399,7 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="18" y="261" width="102" height="16"/>
|
||||
<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"/>
|
||||
@@ -427,8 +407,7 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="18" y="237" width="102" height="16"/>
|
||||
<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"/>
|
||||
@@ -436,8 +415,7 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="18" y="213" width="102" height="16"/>
|
||||
<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"/>
|
||||
@@ -445,19 +423,18 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="126" y="278" width="363" height="23"/>
|
||||
<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"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
<menu key="menu" title="OtherViews" id="j3S-Me-3x5"/>
|
||||
</popUpButtonCell>
|
||||
<connections>
|
||||
<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>
|
||||
@@ -466,63 +443,63 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="126" y="256" width="363" height="21"/>
|
||||
<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="textColor" name="controlTextColor" 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"/>
|
||||
<rect key="frame" x="126" y="232" width="363" height="21"/>
|
||||
<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="textColor" name="controlTextColor" 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"/>
|
||||
<rect key="frame" x="126" y="208" width="363" height="21"/>
|
||||
<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"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<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"/>
|
||||
<rect key="frame" x="140" y="104" width="21" height="16"/>
|
||||
<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"/>
|
||||
@@ -530,8 +507,7 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="195" y="104" width="23" height="16"/>
|
||||
<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"/>
|
||||
@@ -539,8 +515,7 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="251" y="104" width="23" height="16"/>
|
||||
<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"/>
|
||||
@@ -548,49 +523,45 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="304" y="104" width="29" height="16"/>
|
||||
<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"/>
|
||||
<rect key="frame" x="182" y="128" width="48" 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"/>
|
||||
<rect key="frame" x="238" y="128" width="48" 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"/>
|
||||
<rect key="frame" x="294" y="128" width="48" 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"/>
|
||||
<rect key="frame" x="18" y="189" width="102" height="16"/>
|
||||
<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"/>
|
||||
@@ -598,12 +569,11 @@
|
||||
</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"/>
|
||||
<rect key="frame" x="126" y="184" width="363" height="21"/>
|
||||
<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"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
@@ -611,6 +581,20 @@
|
||||
<outlet property="nextKeyView" destination="yz7-y5-TxE" id="9Cb-FK-ium"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="j7v-U4-eMe" customClass="MMAnimatingImageView">
|
||||
<rect key="frame" x="126" y="128" 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"/>
|
||||
@@ -670,6 +654,7 @@
|
||||
<connections>
|
||||
<outlet property="nextKeyView" destination="yz7-y5-TxE" id="WHy-Vl-LGY"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="715" y="459"/>
|
||||
</customView>
|
||||
<menu id="vy8-Pj-2Jg">
|
||||
<items>
|
||||
@@ -702,10 +687,11 @@
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
<point key="canvasLocation" x="139" y="286"/>
|
||||
</menu>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="NSAddTemplate" width="8" height="8"/>
|
||||
<image name="NSRemoveTemplate" width="8" height="8"/>
|
||||
<image name="NSAddTemplate" width="11" height="11"/>
|
||||
<image name="NSRemoveTemplate" width="11" height="11"/>
|
||||
</resources>
|
||||
</document>
|
||||
</document>
|
||||
|
||||
@@ -1,45 +1,46 @@
|
||||
<?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">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="16096" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<deployment defaultVersion="1080" identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="16096"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</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" 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"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
|
||||
<value key="minSize" type="size" width="502" height="310"/>
|
||||
<view key="contentView" id="2">
|
||||
<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 wantsLayer="YES" 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">
|
||||
<clipView key="contentView" wantsLayer="YES" 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">
|
||||
<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">
|
||||
<rect key="frame" x="0.0" y="0.0" width="711" height="311"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<size key="intercellSpacing" width="3" height="12"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<tableColumns>
|
||||
<tableColumn width="708" minWidth="40" maxWidth="9999" id="CBK-sD-upn">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableHeaderCell>
|
||||
@@ -51,12 +52,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"/>
|
||||
<rect key="frame" x="18" y="56" width="96" height="16"/>
|
||||
<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 +66,56 @@
|
||||
<binding destination="syZ-Eq-Lt2" name="value" keyPath="objectValue.name" id="YHc-x9-wXk"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="jdV-zx-iTs">
|
||||
<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="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">
|
||||
<string key="NSValueTransformerName">MCHDValueTransformer</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</imageView>
|
||||
<scrollView wantsLayer="YES" 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="4" width="668" height="44"/>
|
||||
<clipView key="contentView" wantsLayer="YES" copiesOnScroll="NO" id="pc3-Zb-Oqk" customClass="RBLClipView">
|
||||
<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" wantsLayer="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" wantsLayer="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>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OUy-kz-p7o">
|
||||
<rect key="frame" x="118" y="58" width="15" height="11"/>
|
||||
<textFieldCell key="cell" lineBreakMode="clipping" title="by" id="jWt-I0-CSL">
|
||||
<font key="font" metaFont="label" size="9"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bEa-BS-ghQ">
|
||||
<rect key="frame" x="117" y="47" width="48" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<rect key="frame" x="133" y="56" width="49" 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"/>
|
||||
@@ -78,36 +125,28 @@
|
||||
<binding destination="syZ-Eq-Lt2" name="value" keyPath="objectValue.author" id="D3x-S0-YIW"/>
|
||||
</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"/>
|
||||
<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"/>
|
||||
<connections>
|
||||
<binding destination="syZ-Eq-Lt2" name="value" keyPath="objectValue.hiDPI" id="LcB-QZ-MhG">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">MCHDValueTransformer</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="jdV-zx-iTs" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="bEa-BS-ghQ" secondAttribute="trailing" constant="8" symbolic="YES" id="26b-X6-0Yk"/>
|
||||
<constraint firstItem="Hfe-RO-hVE" firstAttribute="leading" secondItem="syZ-Eq-Lt2" secondAttribute="leading" constant="20" symbolic="YES" id="OHp-3c-ujO"/>
|
||||
<constraint firstItem="QMa-EX-Son" firstAttribute="leading" secondItem="jdV-zx-iTs" secondAttribute="trailing" constant="8" symbolic="YES" id="QfE-A7-Oc8"/>
|
||||
<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="firstBaseline" secondItem="OUy-kz-p7o" secondAttribute="firstBaseline" id="Yif-mq-VLO"/>
|
||||
<constraint firstItem="bEa-BS-ghQ" firstAttribute="baseline" secondItem="Hfe-RO-hVE" secondAttribute="baseline" id="bCc-gQ-FVG"/>
|
||||
<constraint firstItem="bEa-BS-ghQ" firstAttribute="leading" secondItem="OUy-kz-p7o" secondAttribute="trailing" constant="4" id="eYj-8T-6Xr"/>
|
||||
<constraint firstItem="OUy-kz-p7o" firstAttribute="leading" secondItem="Hfe-RO-hVE" secondAttribute="trailing" constant="8" id="eeG-7o-lDi"/>
|
||||
<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"/>
|
||||
<constraint firstItem="OUy-kz-p7o" firstAttribute="firstBaseline" secondItem="Hfe-RO-hVE" secondAttribute="firstBaseline" id="yX1-CS-CfT"/>
|
||||
</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"/>
|
||||
@@ -123,14 +162,11 @@
|
||||
</connections>
|
||||
</tableView>
|
||||
</subviews>
|
||||
<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"/>
|
||||
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="uK0-YP-77b">
|
||||
<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"/>
|
||||
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="q1a-eU-6AV">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
</scrollView>
|
||||
@@ -145,6 +181,7 @@
|
||||
<connections>
|
||||
<outlet property="delegate" destination="-2" id="4"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="-39" y="187"/>
|
||||
</window>
|
||||
<viewController title="Library" id="zL4-Ay-t4Q" customClass="MCLibraryViewController">
|
||||
<connections>
|
||||
@@ -160,17 +197,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,27 +215,27 @@ 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>
|
||||
<point key="canvasLocation" x="9" y="-116"/>
|
||||
</menu>
|
||||
<customView id="3Ui-b0-Yod" userLabel="Accessory">
|
||||
<rect key="frame" x="0.0" y="0.0" width="251" height="21"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<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"/>
|
||||
<rect key="frame" x="-2" y="4" width="245" height="14"/>
|
||||
<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"/>
|
||||
<font key="font" metaFont="message" size="11"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
@@ -221,10 +258,47 @@ CA
|
||||
<constraint firstItem="cSP-XN-7we" firstAttribute="centerY" secondItem="3Ui-b0-Yod" secondAttribute="centerY" id="U7A-WI-2JG"/>
|
||||
<constraint firstItem="cSP-XN-7we" firstAttribute="leading" secondItem="3Ui-b0-Yod" secondAttribute="leading" id="eoA-bD-pz5"/>
|
||||
</constraints>
|
||||
<point key="canvasLocation" x="499" y="-594"/>
|
||||
</customView>
|
||||
<view id="smV-Cs-4aH">
|
||||
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<point key="canvasLocation" x="499" y="-311"/>
|
||||
</view>
|
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" releasedWhenClosed="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="1417"/>
|
||||
<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="348" height="20"/>
|
||||
</progressIndicator>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ui8-vk-7P8">
|
||||
<rect key="frame" x="369" y="22" width="70" height="16"/>
|
||||
<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>
|
||||
|
||||
@@ -1,53 +1,63 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "16x16",
|
||||
"idiom" : "mac",
|
||||
"filename" : "Mousecape-10 (dragged).png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "16x16",
|
||||
"idiom" : "mac",
|
||||
"filename" : "Mousecape-9 (dragged).png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "32x32",
|
||||
"idiom" : "mac",
|
||||
"filename" : "Mousecape-8 (dragged).png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "32x32",
|
||||
"idiom" : "mac",
|
||||
"filename" : "Mousecape-7 (dragged).png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "128x128",
|
||||
"idiom" : "mac",
|
||||
"filename" : "Mousecape-6 (dragged).png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "128x128",
|
||||
"idiom" : "mac",
|
||||
"filename" : "Mousecape-5 (dragged).png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "256x256",
|
||||
"idiom" : "mac",
|
||||
"filename" : "Mousecape-4 (dragged).png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "256x256",
|
||||
"idiom" : "mac",
|
||||
"filename" : "Mousecape-3 (dragged).png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "512x512",
|
||||
"idiom" : "mac",
|
||||
"filename" : "Mousecape-2 (dragged).png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "512x512",
|
||||
"idiom" : "mac",
|
||||
"filename" : "Mousecape-1 (dragged).png",
|
||||
"scale" : "2x"
|
||||
}
|
||||
],
|
||||
|
||||
|
After Width: | Height: | Size: 676 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 8.3 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 216 KiB |
@@ -0,0 +1,68 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "icon_16x16 copy.png",
|
||||
"idiom" : "mac",
|
||||
"scale" : "1x",
|
||||
"size" : "16x16"
|
||||
},
|
||||
{
|
||||
"filename" : "icon_16x16@2x.png",
|
||||
"idiom" : "mac",
|
||||
"scale" : "2x",
|
||||
"size" : "16x16"
|
||||
},
|
||||
{
|
||||
"filename" : "icon_32x32.png",
|
||||
"idiom" : "mac",
|
||||
"scale" : "1x",
|
||||
"size" : "32x32"
|
||||
},
|
||||
{
|
||||
"filename" : "icon_32x32@2x.png",
|
||||
"idiom" : "mac",
|
||||
"scale" : "2x",
|
||||
"size" : "32x32"
|
||||
},
|
||||
{
|
||||
"filename" : "icon_128.png",
|
||||
"idiom" : "mac",
|
||||
"scale" : "1x",
|
||||
"size" : "128x128"
|
||||
},
|
||||
{
|
||||
"filename" : "icon_128x128@2x.png",
|
||||
"idiom" : "mac",
|
||||
"scale" : "2x",
|
||||
"size" : "128x128"
|
||||
},
|
||||
{
|
||||
"filename" : "icon_256.png",
|
||||
"idiom" : "mac",
|
||||
"scale" : "1x",
|
||||
"size" : "256x256"
|
||||
},
|
||||
{
|
||||
"filename" : "256@2x.png",
|
||||
"idiom" : "mac",
|
||||
"scale" : "2x",
|
||||
"size" : "256x256"
|
||||
},
|
||||
{
|
||||
"filename" : "icon_512.png",
|
||||
"idiom" : "mac",
|
||||
"scale" : "1x",
|
||||
"size" : "512x512"
|
||||
},
|
||||
{
|
||||
"filename" : "icon_512@2x.png",
|
||||
"idiom" : "mac",
|
||||
"scale" : "2x",
|
||||
"size" : "512x512"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 981 B |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 216 KiB |
|
After Width: | Height: | Size: 704 KiB |
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
@@ -2,13 +2,17 @@
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "HDTemplate.png"
|
||||
"filename" : "HDTemplate.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "HDTemplate@2x.png"
|
||||
"filename" : "HDTemplate@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
|
||||
@@ -2,13 +2,17 @@
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "SDTemplate.png"
|
||||
"filename" : "SDTemplate.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "SDTemplate@2x.png"
|
||||
"filename" : "SDTemplate@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
|
||||
@@ -2,13 +2,17 @@
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "applied.png"
|
||||
"filename" : "applied.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "applied@2x.png"
|
||||
"filename" : "applied@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
|
||||
@@ -2,13 +2,17 @@
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "dz.png"
|
||||
"filename" : "dz.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "dz@2x.png"
|
||||
"filename" : "dz@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
|
||||
@@ -14,8 +14,6 @@
|
||||
#import "MASPreferencesWindowController.h"
|
||||
#import "MCGeneralPreferencesController.h"
|
||||
|
||||
static AuthorizationRef obtainRights();
|
||||
|
||||
@interface MCAppDelegate () {
|
||||
MASPreferencesWindowController *_preferencesWindowController;
|
||||
}
|
||||
@@ -26,14 +24,22 @@ static AuthorizationRef obtainRights();
|
||||
@implementation MCAppDelegate
|
||||
@dynamic preferencesWindowController;
|
||||
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
||||
[self configureHelperToolMenuItem];
|
||||
- (void)applicationWillFinishLaunching:(NSNotification *)notification {
|
||||
self.libraryWindowController = [[MCLibraryWindowController alloc] initWithWindowNibName:@"Library"];
|
||||
[self.libraryWindowController showWindow:self];
|
||||
[self.libraryWindowController loadWindow];
|
||||
}
|
||||
|
||||
- (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag {
|
||||
[self.libraryWindowController showWindow:sender];
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
||||
[self configureHelperToolMenuItem];
|
||||
[self.libraryWindowController showWindow:self];
|
||||
|
||||
// Re-apply currently applied cape
|
||||
if (self.libraryWindowController.libraryViewController.libraryController.appliedCape != NULL) {
|
||||
[self.libraryWindowController.libraryViewController.libraryController applyCape:self.libraryWindowController.libraryViewController.libraryController.appliedCape];
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
|
||||
return YES;
|
||||
}
|
||||
|
||||
@@ -47,61 +53,59 @@ 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])];
|
||||
[self.toggleHelperItem setTitle:self.toggleHelperItem.tag ? @"Uninstall Helper Tool" : @"Install Helper Tool"];
|
||||
CFDictionaryRef dict = SMJobCopyDictionary(kSMDomainUserLaunchd, CFSTR("com.alexzielenski.mousecloakhelper"));
|
||||
|
||||
[self.toggleHelperItem setTag: dict ? 1 : 0];
|
||||
[self.toggleHelperItem setTitle:self.toggleHelperItem.tag ?
|
||||
NSLocalizedString(@"Uninstall Helper Tool", "Uninstall Helper Tool Menu Item") :
|
||||
NSLocalizedString(@"Install Helper Tool", "Install Helper Tool Menu Item")];
|
||||
|
||||
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:NSLocalizedString(@"Uninstall Helper Tool", "Uninstall Helper Tool Menu Item")];
|
||||
|
||||
NSRunAlertPanel(NSLocalizedString(@"Sucess", "Helper Tool Install Result Title Success"),
|
||||
NSLocalizedString(@"The Mousecape helper was successfully installed", "Helper Tool Install Success Result useless description"),
|
||||
NSLocalizedString(@"Sweet", "Helper Tool Install Result Gratitude 1"),
|
||||
NSLocalizedString(@"Thanks", "Helper Tool Install Result Gratitude 2"), nil);
|
||||
} else if (success) {
|
||||
// Successfully Uninstalled
|
||||
[self.toggleHelperItem setTag: 0];
|
||||
[self.toggleHelperItem setTitle:NSLocalizedString(@"Install Helper Tool", "Install Helper Tool Menu Item")];
|
||||
|
||||
NSRunAlertPanel(NSLocalizedString(@"Sucess", "Helper Tool Uninstall Result Title Success"),
|
||||
NSLocalizedString(@"The Mousecape helper was successfully uninstalled", "Helper Tool Uninstall Success Result useless description"),
|
||||
NSLocalizedString(@"Sweet", "Helper Tool Uninstall Result Gratitude 1"),
|
||||
NSLocalizedString(@"Thanks", "Helper Tool Uninstall Result Gratitude 2"), nil);
|
||||
} else {
|
||||
NSRunAlertPanel(NSLocalizedString(@"Failure", "Helper Tool Result Title Failure"),
|
||||
NSLocalizedString(@"The action did not complete successfully", "Helper Tool Result Useless Failure Description"),
|
||||
NSLocalizedString(@"Fuck", "Helper Tool Result Failure Expletive"), nil, nil);
|
||||
}
|
||||
|
||||
AuthorizationFree(authRef, kAuthorizationFlagDestroyRights);
|
||||
[self configureHelperToolMenuItem];
|
||||
}
|
||||
|
||||
- (MASPreferencesWindowController *)preferencesWindowController {
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
NSViewController *general = [[MCGeneralPreferencesController alloc] init];
|
||||
_preferencesWindowController = [[MASPreferencesWindowController alloc] initWithViewControllers:@[ general ] title:NSLocalizedString(@"Preferences", nil)];
|
||||
_preferencesWindowController = [[MASPreferencesWindowController alloc] initWithViewControllers:@[ general ] title:NSLocalizedString(@"Preferences", "Preferences Window Title")];
|
||||
});
|
||||
|
||||
return _preferencesWindowController;
|
||||
@@ -115,16 +119,16 @@ static AuthorizationRef obtainRights();
|
||||
|
||||
- (IBAction)convertCape:(id)sender {
|
||||
NSOpenPanel *panel = [NSOpenPanel openPanel];
|
||||
panel.allowedFileTypes = @[ @"MightyMouse" ];
|
||||
panel.title = @"Import";
|
||||
panel.message = @"Choose a MightyMouse file to import";
|
||||
panel.prompt = @"Import";
|
||||
panel.allowedFileTypes = @[ @"MightyMouse" ];
|
||||
panel.title = NSLocalizedString(@"Import", "MightyMouse Import Panel Title");
|
||||
panel.message = NSLocalizedString(@"Choose a MightyMouse file to import", "MightyMouse Import Panel useless description");
|
||||
panel.prompt = NSLocalizedString(@"Import", "MightyMouse Import Panel Prompt");
|
||||
if ([panel runModal] == NSFileHandlingPanelOKButton) {
|
||||
NSString *name = panel.URL.lastPathComponent.stringByDeletingPathExtension;
|
||||
NSDictionary *metadata = @{
|
||||
@"name": name,
|
||||
@"version": @1.0,
|
||||
@"author": @"Unknown",
|
||||
@"author": NSLocalizedString(@"Unknown", "MightyMouse Import Default Author"),
|
||||
@"identifier": [NSString stringWithFormat:@"local.import.%@.%f", name, [NSDate timeIntervalSinceReferenceDate]]
|
||||
};
|
||||
|
||||
@@ -140,10 +144,10 @@ static AuthorizationRef obtainRights();
|
||||
|
||||
- (IBAction)openDocument:(id)sender {
|
||||
NSOpenPanel *panel = [NSOpenPanel openPanel];
|
||||
panel.allowedFileTypes = @[ @"cape" ];
|
||||
panel.title = @"Import";
|
||||
panel.message = @"Choose a Mousecape to import";
|
||||
panel.prompt = @"Import";
|
||||
panel.allowedFileTypes = @[ @"cape" ];
|
||||
panel.title = NSLocalizedString(@"Import", "Mousecape Import Title");
|
||||
panel.message = NSLocalizedString(@"Choose a Mousecape to import", "Mousecape Import useless description");
|
||||
panel.prompt = NSLocalizedString(@"Import", "Mousecape Import Prompt");
|
||||
if ([panel runModal] == NSFileHandlingPanelOKButton) {
|
||||
[self.libraryWindowController.libraryViewController.libraryController importCapeAtURL:panel.URL];
|
||||
}
|
||||
@@ -154,26 +158,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;
|
||||
}
|
||||
|
||||
@@ -25,10 +25,8 @@
|
||||
</array>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string></string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.alexzielenski.${PRODUCT_NAME:rfc1034identifier}</string>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
@@ -36,21 +34,25 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.0.2</string>
|
||||
<string>1811</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1079</string>
|
||||
<string>1811</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.utilities</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © 2014 Alex Zielenski. All rights reserved.</string>
|
||||
<string>Copyright © 2014-2020 Alex Zielenski. All rights reserved.</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<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>
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict/>
|
||||
</plist>
|
||||
@@ -0,0 +1,32 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf100
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
{\*\expandedcolortbl;;}
|
||||
\vieww9600\viewh8400\viewkind0
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\partightenfactor0
|
||||
|
||||
\f0\b\fs24 \cf0 Engineering:
|
||||
\f1\b0 \
|
||||
Alex Zielenski\
|
||||
{\field{\*\fldinst{HYPERLINK "http://alexzielenski.com"}}{\fldrslt http://alexzielenski.com}}\
|
||||
\
|
||||
|
||||
\f0\b Icon:\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0
|
||||
|
||||
\f1\b0 \cf0 Allan Nyholm Nielson\
|
||||
{\field{\*\fldinst{HYPERLINK "https://www.deviantart.com/allannyholm"}}{\fldrslt https://www.deviantart.com/allannyholm}}\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\partightenfactor0
|
||||
\cf0 \
|
||||
|
||||
\f0\b Testing:
|
||||
\f1\b0 \
|
||||
Justin Ayles\
|
||||
\
|
||||
|
||||
\f0\b With special thanks to:
|
||||
\f1\b0 \
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\partightenfactor0
|
||||
{\field{\*\fldinst{HYPERLINK "http://maxrudberg.com"}}{\fldrslt \cf0 Max Rudberg}}\
|
||||
Mom & Dad\
|
||||
}
|
||||
@@ -0,0 +1,695 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="16096" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="16096"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="MCEditWindowController">
|
||||
<connections>
|
||||
<outlet property="detailView" destination="fzz-Li-KC6" id="o4X-5d-9UA"/>
|
||||
<outlet property="editCapeController" destination="Bu6-lg-x1j" id="K0b-fF-JHE"/>
|
||||
<outlet property="editDetailController" destination="tMj-cQ-hK0" id="i1B-Pa-vlp"/>
|
||||
<outlet property="editListController" destination="oUs-Nv-PHw" id="C2e-6f-Mpe"/>
|
||||
<outlet property="window" destination="1" id="3"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="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="296"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
|
||||
<value key="minSize" type="size" width="500" height="296"/>
|
||||
<view key="contentView" id="2">
|
||||
<rect key="frame" x="0.0" y="0.0" width="525" height="296"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<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="296"/>
|
||||
<subviews>
|
||||
<customView id="IHY-vi-Wpr">
|
||||
<rect key="frame" x="0.0" y="0.0" width="135" height="296"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<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="274"/>
|
||||
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="ame-2S-JV7">
|
||||
<rect key="frame" x="0.0" y="0.0" width="135" height="274"/>
|
||||
<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" rowHeight="32" rowSizeStyle="automatic" viewBased="YES" id="MU4-Yh-0PJ">
|
||||
<rect key="frame" x="0.0" y="0.0" width="135" height="274"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<size key="intercellSpacing" width="3" height="2"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<tableColumns>
|
||||
<tableColumn editable="NO" width="132" minWidth="40" maxWidth="1000" id="B1d-Yp-OOR">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
|
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableHeaderCell>
|
||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="EOd-L3-If3">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView identifier="MCCursorLibrary" id="ti0-Bq-1rU">
|
||||
<rect key="frame" x="1" y="1" width="132" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="tn7-kB-Fvu">
|
||||
<rect key="frame" x="6" y="8" width="120" height="16"/>
|
||||
<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"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="backgroundStyle">
|
||||
<integer key="value" value="2"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="ti0-Bq-1rU" name="value" keyPath="objectValue.name" id="t1G-Uv-n0y"/>
|
||||
</connections>
|
||||
</textField>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="tn7-kB-Fvu" secondAttribute="trailing" constant="8" id="ilO-BE-fhh"/>
|
||||
<constraint firstAttribute="centerY" secondItem="tn7-kB-Fvu" secondAttribute="centerY" id="xFa-kX-vgG"/>
|
||||
<constraint firstItem="tn7-kB-Fvu" firstAttribute="leading" secondItem="ti0-Bq-1rU" secondAttribute="leading" constant="8" id="zRO-gF-Fjk"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="textField" destination="tn7-kB-Fvu" id="EIu-dF-vgX"/>
|
||||
</connections>
|
||||
</tableCellView>
|
||||
<tableCellView identifier="MCCursor" id="ldl-Zk-KLa">
|
||||
<rect key="frame" x="1" y="35" width="132" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="W6i-Uv-3TI">
|
||||
<rect key="frame" x="6" y="1" width="120" height="16"/>
|
||||
<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"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="ldl-Zk-KLa" name="value" keyPath="objectValue.name" id="OuH-uQ-nFp"/>
|
||||
</connections>
|
||||
</textField>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="centerY" secondItem="W6i-Uv-3TI" secondAttribute="centerY" id="JPw-Qf-DNs"/>
|
||||
<constraint firstItem="W6i-Uv-3TI" firstAttribute="leading" secondItem="ldl-Zk-KLa" secondAttribute="leading" constant="8" id="WvV-tP-TPf"/>
|
||||
<constraint firstAttribute="trailing" secondItem="W6i-Uv-3TI" secondAttribute="trailing" constant="8" id="zV0-3Z-fAD"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="textField" destination="W6i-Uv-3TI" id="rCr-ZD-nty"/>
|
||||
</connections>
|
||||
</tableCellView>
|
||||
</prototypeCellViews>
|
||||
</tableColumn>
|
||||
</tableColumns>
|
||||
<connections>
|
||||
<outlet property="dataSource" destination="oUs-Nv-PHw" id="ur0-Pm-oqJ"/>
|
||||
<outlet property="delegate" destination="oUs-Nv-PHw" id="GMA-yd-uCn"/>
|
||||
<outlet property="menu" destination="vy8-Pj-2Jg" id="4S4-YC-adi"/>
|
||||
<outlet property="nextKeyView" destination="fzz-Li-KC6" id="Mg7-QD-IZj"/>
|
||||
</connections>
|
||||
</tableView>
|
||||
</subviews>
|
||||
<nil key="backgroundColor"/>
|
||||
</clipView>
|
||||
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="ARR-bd-5zK">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="3rZ-7d-Mro">
|
||||
<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"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="22" id="Fdb-xA-sn9"/>
|
||||
<constraint firstAttribute="height" constant="22" id="iNY-lh-RsQ"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="smallSquare" bezelStyle="smallSquare" image="NSAddTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="xv7-ZP-O2C">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="addAction:" target="oUs-Nv-PHw" id="QeK-Mq-YfI"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="w4h-lB-jLi">
|
||||
<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="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"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="removeAction:" target="oUs-Nv-PHw" id="JjR-lV-zwz"/>
|
||||
</connections>
|
||||
</button>
|
||||
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="UJO-Hw-fRK">
|
||||
<rect key="frame" x="0.0" y="19" width="135" height="5"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="1" id="NYz-xn-F0g"/>
|
||||
</constraints>
|
||||
</box>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="UJO-Hw-fRK" secondAttribute="trailing" id="1nr-pf-XFQ"/>
|
||||
<constraint firstAttribute="bottom" secondItem="UJO-Hw-fRK" secondAttribute="bottom" constant="21" id="6Ak-tM-Cac"/>
|
||||
<constraint firstItem="0ps-WH-ASN" firstAttribute="width" secondItem="w4h-lB-jLi" secondAttribute="width" id="97v-Rq-d09"/>
|
||||
<constraint firstAttribute="bottom" secondItem="0ps-WH-ASN" secondAttribute="bottom" id="Afn-3d-zKF"/>
|
||||
<constraint firstItem="UJO-Hw-fRK" firstAttribute="leading" secondItem="IHY-vi-Wpr" secondAttribute="leading" id="C8U-9e-Hyh"/>
|
||||
<constraint firstAttribute="trailing" secondItem="2UQ-R4-qJn" secondAttribute="trailing" id="LC4-J4-2bn"/>
|
||||
<constraint firstItem="2UQ-R4-qJn" firstAttribute="top" secondItem="IHY-vi-Wpr" secondAttribute="top" id="NyE-Z9-XCc"/>
|
||||
<constraint firstItem="0ps-WH-ASN" firstAttribute="leading" secondItem="IHY-vi-Wpr" secondAttribute="leading" id="kvW-tW-AQF"/>
|
||||
<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" constant="2" id="uJj-nv-0fc"/>
|
||||
<constraint firstAttribute="bottom" secondItem="2UQ-R4-qJn" secondAttribute="bottom" constant="22" id="vLX-hs-yVP"/>
|
||||
</constraints>
|
||||
</customView>
|
||||
<customView fixedFrame="YES" id="fzz-Li-KC6">
|
||||
<rect key="frame" x="136" y="0.0" width="389" height="296"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
</customView>
|
||||
</subviews>
|
||||
<holdingPriorities>
|
||||
<real value="250"/>
|
||||
<real value="250"/>
|
||||
</holdingPriorities>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="-2" id="lwv-X3-bDm"/>
|
||||
</connections>
|
||||
</splitView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="3cj-R9-WKK" firstAttribute="leading" secondItem="2" secondAttribute="leading" id="4E6-iP-FpE"/>
|
||||
<constraint firstItem="3cj-R9-WKK" firstAttribute="top" secondItem="2" secondAttribute="top" id="Eam-bF-EPz"/>
|
||||
<constraint firstAttribute="trailing" secondItem="3cj-R9-WKK" secondAttribute="trailing" id="IT0-Rw-fmh"/>
|
||||
<constraint firstAttribute="bottom" secondItem="3cj-R9-WKK" secondAttribute="bottom" id="znR-CB-aDB"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<connections>
|
||||
<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>
|
||||
<outlet property="tableView" destination="MU4-Yh-0PJ" id="TRg-C6-MaW"/>
|
||||
<outlet property="view" destination="MU4-Yh-0PJ" id="xHm-2x-mvT"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<viewController title="Detail" id="tMj-cQ-hK0" customClass="MCEditDetailController">
|
||||
<connections>
|
||||
<outlet property="rep1000View" destination="4hN-Nm-B7Z" id="8iU-1v-yGH"/>
|
||||
<outlet property="rep100View" destination="j7v-U4-eMe" id="X5D-KB-JVI"/>
|
||||
<outlet property="rep200View" destination="ggE-Pd-aWo" id="oJ3-3i-3SZ"/>
|
||||
<outlet property="rep500View" destination="G3t-wd-E5Y" id="u1Y-3n-iRc"/>
|
||||
<outlet property="typePopUpButton" destination="yz7-y5-TxE" id="0Lj-Ty-Oea"/>
|
||||
<outlet property="view" destination="o0X-1i-ZgL" id="fn8-Is-pBo"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<viewController title="Cape" id="Bu6-lg-x1j" customClass="MCEditCapeController">
|
||||
<connections>
|
||||
<outlet property="view" destination="WMR-Vn-IHF" id="tlm-o5-run"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<customView id="WMR-Vn-IHF" userLabel="Cape">
|
||||
<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="261" width="62" height="16"/>
|
||||
<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="213" width="62" height="16"/>
|
||||
<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="237" width="62" height="16"/>
|
||||
<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="285" width="62" height="16"/>
|
||||
<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="86" y="282" width="398" height="21"/>
|
||||
<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="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="Bu6-lg-x1j" name="value" keyPath="cursorLibrary.name" id="QlS-r9-svX"/>
|
||||
<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="86" y="258" width="398" height="21"/>
|
||||
<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="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="Bu6-lg-x1j" name="value" keyPath="cursorLibrary.author" id="CfA-df-u6f"/>
|
||||
<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="86" y="234" width="398" height="21"/>
|
||||
<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="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="Bu6-lg-x1j" name="value" keyPath="cursorLibrary.identifier" id="Vdx-1W-Guz">
|
||||
<dictionary key="options">
|
||||
<bool key="NSValidatesImmediately" value="YES"/>
|
||||
</dictionary>
|
||||
</binding>
|
||||
<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="86" y="210" width="398" height="21"/>
|
||||
<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="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="oUs-Nv-PHw" name="value" keyPath="cursorLibrary.version" id="pHV-5a-ce5"/>
|
||||
<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="189" width="62" height="16"/>
|
||||
<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="84" y="186" 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"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<binding destination="Bu6-lg-x1j" name="value" keyPath="cursorLibrary.hiDPI" id="jnk-dy-w9m"/>
|
||||
<outlet property="nextKeyView" destination="bim-1a-xuh" id="flN-6L-Vpz"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="leading" secondItem="bim-1a-xuh" secondAttribute="leading" id="0xF-zq-ScD"/>
|
||||
<constraint firstAttribute="trailing" secondItem="XYx-UL-WbM" secondAttribute="trailing" constant="20" id="2FH-UV-gN8"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="width" secondItem="xy3-2B-C0h" secondAttribute="width" id="5Ga-DV-3Po"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="MJr-Jz-5Cq" secondAttribute="trailing" constant="20" symbolic="YES" id="6NT-lK-p2E"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="width" secondItem="XYx-UL-WbM" secondAttribute="width" id="78w-Rp-5Kn"/>
|
||||
<constraint firstItem="bim-1a-xuh" firstAttribute="top" secondItem="WMR-Vn-IHF" secondAttribute="top" constant="18" id="7md-u2-mQL"/>
|
||||
<constraint firstAttribute="trailing" secondItem="car-it-RsL" secondAttribute="trailing" constant="20" id="8og-5G-f3t"/>
|
||||
<constraint firstItem="CTE-6h-rbf" firstAttribute="leading" secondItem="yyn-IO-TkO" secondAttribute="leading" id="A71-62-pAd"/>
|
||||
<constraint firstItem="CTE-6h-rbf" firstAttribute="trailing" secondItem="X2i-rg-HDg" secondAttribute="trailing" id="B5V-w4-E4R"/>
|
||||
<constraint firstItem="xy3-2B-C0h" firstAttribute="top" secondItem="bim-1a-xuh" secondAttribute="bottom" constant="3" id="Ba8-n2-AJY"/>
|
||||
<constraint firstItem="CTE-6h-rbf" firstAttribute="trailing" secondItem="ELX-ej-rTb" secondAttribute="trailing" id="CUf-rI-rpu"/>
|
||||
<constraint firstItem="CTE-6h-rbf" firstAttribute="width" secondItem="X2i-rg-HDg" secondAttribute="width" id="D9Z-q0-phl"/>
|
||||
<constraint firstItem="ELX-ej-rTb" firstAttribute="top" secondItem="X2i-rg-HDg" secondAttribute="bottom" constant="8" id="DLd-62-Iep"/>
|
||||
<constraint firstItem="CTE-6h-rbf" firstAttribute="width" secondItem="ELX-ej-rTb" secondAttribute="width" id="DNc-Oi-qtL"/>
|
||||
<constraint firstItem="CTE-6h-rbf" firstAttribute="leading" secondItem="X2i-rg-HDg" secondAttribute="leading" id="Dzm-RT-QGr"/>
|
||||
<constraint firstItem="CTE-6h-rbf" firstAttribute="leading" secondItem="ELX-ej-rTb" secondAttribute="leading" id="H6H-IO-OIS"/>
|
||||
<constraint firstItem="CTE-6h-rbf" firstAttribute="trailing" secondItem="yyn-IO-TkO" secondAttribute="trailing" id="Iox-22-dSy"/>
|
||||
<constraint firstItem="yyn-IO-TkO" firstAttribute="top" secondItem="ELX-ej-rTb" secondAttribute="bottom" constant="8" id="IxV-Aj-Agw"/>
|
||||
<constraint firstItem="yyn-IO-TkO" firstAttribute="trailing" secondItem="i5v-yD-weq" secondAttribute="trailing" id="JJ3-CQ-MYe"/>
|
||||
<constraint firstItem="CTE-6h-rbf" firstAttribute="top" secondItem="WMR-Vn-IHF" secondAttribute="top" constant="20" symbolic="YES" id="Nav-P8-ewc"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="leading" secondItem="xy3-2B-C0h" secondAttribute="leading" id="Ofe-x8-Iz6"/>
|
||||
<constraint firstItem="yyn-IO-TkO" firstAttribute="width" secondItem="i5v-yD-weq" secondAttribute="width" id="Pbq-09-PEz"/>
|
||||
<constraint firstAttribute="trailing" secondItem="xy3-2B-C0h" secondAttribute="trailing" constant="20" id="QaY-Yd-7ki"/>
|
||||
<constraint firstAttribute="trailing" secondItem="bim-1a-xuh" secondAttribute="trailing" constant="20" id="Qgd-dL-t4L"/>
|
||||
<constraint firstItem="XYx-UL-WbM" firstAttribute="top" secondItem="xy3-2B-C0h" secondAttribute="bottom" constant="3" id="S7k-zO-aLb"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="width" secondItem="bim-1a-xuh" secondAttribute="width" id="Scq-gg-9Mp"/>
|
||||
<constraint firstItem="bim-1a-xuh" firstAttribute="leading" secondItem="CTE-6h-rbf" secondAttribute="trailing" constant="8" symbolic="YES" id="V76-cY-GEg"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="trailing" secondItem="XYx-UL-WbM" secondAttribute="trailing" id="YTL-Eq-h2J"/>
|
||||
<constraint firstItem="X2i-rg-HDg" firstAttribute="top" secondItem="CTE-6h-rbf" secondAttribute="bottom" constant="8" id="b3A-aW-7fb"/>
|
||||
<constraint firstItem="i5v-yD-weq" firstAttribute="top" secondItem="yyn-IO-TkO" secondAttribute="bottom" constant="8" id="dGT-5B-B1c"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="leading" secondItem="MJr-Jz-5Cq" secondAttribute="leading" id="e2s-Um-zcp"/>
|
||||
<constraint firstItem="CTE-6h-rbf" firstAttribute="leading" secondItem="WMR-Vn-IHF" secondAttribute="leading" constant="20" symbolic="YES" id="g0a-i4-KIf"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="top" secondItem="XYx-UL-WbM" secondAttribute="bottom" constant="3" id="ol9-vF-CGP"/>
|
||||
<constraint firstItem="MJr-Jz-5Cq" firstAttribute="top" secondItem="car-it-RsL" secondAttribute="bottom" constant="8" id="rTY-Fr-65b"/>
|
||||
<constraint firstItem="CTE-6h-rbf" firstAttribute="width" secondItem="yyn-IO-TkO" secondAttribute="width" id="sb9-dg-qOh"/>
|
||||
<constraint firstItem="i5v-yD-weq" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="WMR-Vn-IHF" secondAttribute="leading" constant="20" symbolic="YES" id="wYl-BB-jBi"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="trailing" secondItem="xy3-2B-C0h" secondAttribute="trailing" id="wpN-fF-mXb"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="trailing" secondItem="bim-1a-xuh" secondAttribute="trailing" id="wtJ-Bc-d9Z"/>
|
||||
<constraint firstItem="car-it-RsL" firstAttribute="leading" secondItem="XYx-UL-WbM" secondAttribute="leading" id="yFH-4V-CiS"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="nextKeyView" destination="bim-1a-xuh" id="YxQ-sZ-TFh"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="139" y="157"/>
|
||||
</customView>
|
||||
<customView id="o0X-1i-ZgL" userLabel="Detail">
|
||||
<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="285" width="102" height="16"/>
|
||||
<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="261" width="102" height="16"/>
|
||||
<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="237" width="102" height="16"/>
|
||||
<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="213" width="102" height="16"/>
|
||||
<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="126" y="278" width="363" height="23"/>
|
||||
<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="system"/>
|
||||
<menu key="menu" title="OtherViews" id="j3S-Me-3x5"/>
|
||||
</popUpButtonCell>
|
||||
<connections>
|
||||
<binding destination="tMj-cQ-hK0" name="selectedValue" keyPath="cursor.identifier" id="2aq-Lm-1Lm">
|
||||
<dictionary key="options">
|
||||
<string key="NSMultipleValuesPlaceholder">Unknown</string>
|
||||
<string key="NSNoSelectionPlaceholder">Unknown</string>
|
||||
<string key="NSNotApplicablePlaceholder">Unknown</string>
|
||||
<string key="NSNullPlaceholder">Unknown</string>
|
||||
<string key="NSValueTransformerName">MCCursorTypeValueTransformer</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
<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="126" y="256" width="363" height="21"/>
|
||||
<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" 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"/>
|
||||
</numberFormatter>
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" 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="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="126" y="232" width="363" height="21"/>
|
||||
<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" 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"/>
|
||||
</numberFormatter>
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" 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="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="126" y="208" width="363" height="21"/>
|
||||
<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"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<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="140" y="104" width="21" height="16"/>
|
||||
<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="195" y="104" width="23" height="16"/>
|
||||
<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="251" y="104" width="23" height="16"/>
|
||||
<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="304" y="104" width="29" height="16"/>
|
||||
<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="ggE-Pd-aWo" customClass="MMAnimatingImageView">
|
||||
<rect key="frame" x="182" y="128" width="48" 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="238" y="128" width="48" 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="294" y="128" width="48" 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="189" width="102" height="16"/>
|
||||
<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="126" y="184" width="363" height="21"/>
|
||||
<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"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.size" id="dXp-5z-YR6"/>
|
||||
<outlet property="nextKeyView" destination="yz7-y5-TxE" id="9Cb-FK-ium"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="j7v-U4-eMe" customClass="MMAnimatingImageView">
|
||||
<rect key="frame" x="126" y="128" 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"/>
|
||||
<constraint firstItem="D5V-CV-BuE" firstAttribute="top" secondItem="rms-zC-s1M" secondAttribute="top" id="43J-XT-GHl"/>
|
||||
<constraint firstItem="Dm8-Mj-s5f" firstAttribute="top" secondItem="yz7-y5-TxE" secondAttribute="top" id="4iw-ff-qi7"/>
|
||||
<constraint firstItem="aso-MD-Alm" firstAttribute="top" secondItem="zEj-zS-uzh" secondAttribute="bottom" constant="8" symbolic="YES" id="5Wt-dl-pef"/>
|
||||
<constraint firstItem="rms-zC-s1M" firstAttribute="leading" secondItem="VbK-WJ-M0L" secondAttribute="leading" id="5dM-sY-h4p"/>
|
||||
<constraint firstItem="j7v-U4-eMe" firstAttribute="leading" secondItem="wdB-yr-r6Y" secondAttribute="leading" id="7xA-ei-9JR"/>
|
||||
<constraint firstItem="zEj-zS-uzh" firstAttribute="leading" secondItem="D5V-CV-BuE" secondAttribute="leading" id="8Cv-6e-Tzx"/>
|
||||
<constraint firstItem="G3t-wd-E5Y" firstAttribute="height" secondItem="4hN-Nm-B7Z" secondAttribute="height" id="8qD-iY-MRu"/>
|
||||
<constraint firstItem="G3t-wd-E5Y" firstAttribute="width" secondItem="ggE-Pd-aWo" secondAttribute="width" id="ASq-Gp-wuC"/>
|
||||
<constraint firstItem="OAt-gN-EX5" firstAttribute="top" secondItem="wdB-yr-r6Y" secondAttribute="top" id="Adr-uG-x9t"/>
|
||||
<constraint firstItem="4hN-Nm-B7Z" firstAttribute="leading" secondItem="G3t-wd-E5Y" secondAttribute="trailing" constant="8" id="AlK-6b-Sni"/>
|
||||
<constraint firstItem="j7v-U4-eMe" firstAttribute="top" secondItem="wdB-yr-r6Y" secondAttribute="bottom" constant="8" id="BW4-UU-kQB"/>
|
||||
<constraint firstItem="75v-aw-FbU" firstAttribute="centerX" secondItem="j7v-U4-eMe" secondAttribute="centerX" id="ClP-It-NEr"/>
|
||||
<constraint firstItem="D5V-CV-BuE" firstAttribute="top" secondItem="Dm8-Mj-s5f" secondAttribute="bottom" constant="8" symbolic="YES" id="EWh-4Q-i3w"/>
|
||||
<constraint firstItem="rms-zC-s1M" firstAttribute="leading" secondItem="D5V-CV-BuE" secondAttribute="trailing" constant="8" symbolic="YES" id="JaG-3Y-FgQ"/>
|
||||
<constraint firstItem="Hoi-Pr-5wz" firstAttribute="centerX" secondItem="ggE-Pd-aWo" secondAttribute="centerX" id="Lm2-Ms-dVL"/>
|
||||
<constraint firstItem="rms-zC-s1M" firstAttribute="trailing" secondItem="yz7-y5-TxE" secondAttribute="trailing" id="MKf-wc-NLL"/>
|
||||
<constraint firstItem="G3t-wd-E5Y" firstAttribute="top" secondItem="ggE-Pd-aWo" secondAttribute="top" id="NM5-rE-34J"/>
|
||||
<constraint firstItem="Qcr-83-Tz0" firstAttribute="leading" secondItem="aso-MD-Alm" secondAttribute="trailing" constant="8" symbolic="YES" id="NO1-Yp-z3e"/>
|
||||
<constraint firstItem="G3t-wd-E5Y" firstAttribute="width" secondItem="j7v-U4-eMe" secondAttribute="width" id="NvM-wM-1NF"/>
|
||||
<constraint firstItem="OAt-gN-EX5" firstAttribute="width" secondItem="aso-MD-Alm" secondAttribute="width" id="PX5-Da-w21"/>
|
||||
<constraint firstItem="Dm8-Mj-s5f" firstAttribute="top" secondItem="o0X-1i-ZgL" secondAttribute="top" constant="20" symbolic="YES" id="R6W-ih-OYh"/>
|
||||
<constraint firstItem="zEj-zS-uzh" firstAttribute="leading" secondItem="aso-MD-Alm" secondAttribute="leading" id="RsR-Ul-Ou2"/>
|
||||
<constraint firstItem="D5V-CV-BuE" firstAttribute="leading" secondItem="Dm8-Mj-s5f" secondAttribute="leading" id="S08-SQ-GJR"/>
|
||||
<constraint firstItem="Qcr-83-Tz0" firstAttribute="top" secondItem="aso-MD-Alm" secondAttribute="top" id="SxH-Ps-hpM"/>
|
||||
<constraint firstItem="VbK-WJ-M0L" firstAttribute="leading" secondItem="zEj-zS-uzh" secondAttribute="trailing" constant="8" symbolic="YES" id="UXO-ZW-ccB"/>
|
||||
<constraint firstItem="ggE-Pd-aWo" firstAttribute="leading" secondItem="j7v-U4-eMe" secondAttribute="trailing" constant="8" id="VHK-Y8-lMy"/>
|
||||
<constraint firstItem="VbK-WJ-M0L" firstAttribute="trailing" secondItem="rms-zC-s1M" secondAttribute="trailing" id="Vxm-cc-Nuz"/>
|
||||
<constraint firstItem="wdB-yr-r6Y" firstAttribute="leading" secondItem="OAt-gN-EX5" secondAttribute="trailing" constant="8" symbolic="YES" id="WLf-wT-t5d"/>
|
||||
<constraint firstItem="zEj-zS-uzh" firstAttribute="top" secondItem="D5V-CV-BuE" secondAttribute="bottom" constant="8" symbolic="YES" id="X0Y-Zf-ilJ"/>
|
||||
<constraint firstItem="wdB-yr-r6Y" firstAttribute="trailing" secondItem="Qcr-83-Tz0" secondAttribute="trailing" id="Yac-TY-Rux"/>
|
||||
<constraint firstItem="75v-aw-FbU" firstAttribute="top" secondItem="j7v-U4-eMe" secondAttribute="bottom" constant="8" id="Yah-L4-Jlp"/>
|
||||
<constraint firstItem="Dm8-Mj-s5f" firstAttribute="leading" secondItem="o0X-1i-ZgL" secondAttribute="leading" constant="20" symbolic="YES" id="ZQi-nH-fRj"/>
|
||||
<constraint firstItem="CWo-oD-OZX" firstAttribute="centerX" secondItem="G3t-wd-E5Y" secondAttribute="centerX" id="ZcC-5o-S4M"/>
|
||||
<constraint firstItem="G3t-wd-E5Y" firstAttribute="width" secondItem="4hN-Nm-B7Z" secondAttribute="width" id="bMf-aA-2io"/>
|
||||
<constraint firstItem="Qcr-83-Tz0" firstAttribute="trailing" secondItem="VbK-WJ-M0L" secondAttribute="trailing" id="e7u-an-cyO"/>
|
||||
<constraint firstItem="Ryz-mP-wNx" firstAttribute="top" secondItem="4hN-Nm-B7Z" secondAttribute="bottom" constant="8" id="eDV-Li-crv"/>
|
||||
<constraint firstItem="yz7-y5-TxE" firstAttribute="leading" secondItem="Dm8-Mj-s5f" secondAttribute="trailing" constant="8" symbolic="YES" id="etw-9O-zNS"/>
|
||||
<constraint firstItem="VbK-WJ-M0L" firstAttribute="leading" secondItem="Qcr-83-Tz0" secondAttribute="leading" id="gnA-Qx-Vmj"/>
|
||||
<constraint firstItem="G3t-wd-E5Y" firstAttribute="height" secondItem="ggE-Pd-aWo" secondAttribute="height" id="huK-Kq-0Iu"/>
|
||||
<constraint firstItem="G3t-wd-E5Y" firstAttribute="leading" secondItem="ggE-Pd-aWo" secondAttribute="trailing" constant="8" id="i75-6i-VPd"/>
|
||||
<constraint firstItem="OAt-gN-EX5" firstAttribute="top" secondItem="aso-MD-Alm" secondAttribute="bottom" constant="8" id="itU-V0-MaU"/>
|
||||
<constraint firstItem="Ryz-mP-wNx" firstAttribute="centerX" secondItem="4hN-Nm-B7Z" secondAttribute="centerX" id="jGh-SC-Nxg"/>
|
||||
<constraint firstItem="zEj-zS-uzh" firstAttribute="top" secondItem="VbK-WJ-M0L" secondAttribute="top" id="k7D-La-IeE"/>
|
||||
<constraint firstItem="wdB-yr-r6Y" firstAttribute="top" secondItem="Qcr-83-Tz0" secondAttribute="bottom" constant="3" id="kIE-fx-9LE"/>
|
||||
<constraint firstItem="G3t-wd-E5Y" firstAttribute="height" secondItem="j7v-U4-eMe" secondAttribute="height" id="kyf-78-kT0"/>
|
||||
<constraint firstItem="G3t-wd-E5Y" firstAttribute="top" secondItem="j7v-U4-eMe" secondAttribute="top" id="lhV-oy-6Mm"/>
|
||||
<constraint firstItem="OAt-gN-EX5" firstAttribute="leading" secondItem="aso-MD-Alm" secondAttribute="leading" id="lp9-nD-Nnz"/>
|
||||
<constraint firstItem="wdB-yr-r6Y" firstAttribute="width" secondItem="Qcr-83-Tz0" secondAttribute="width" id="lyT-KO-eXf"/>
|
||||
<constraint firstItem="yz7-y5-TxE" firstAttribute="leading" secondItem="rms-zC-s1M" secondAttribute="leading" id="thH-qo-cIr"/>
|
||||
<constraint firstItem="G3t-wd-E5Y" firstAttribute="top" secondItem="4hN-Nm-B7Z" secondAttribute="top" id="tvs-VW-0YR"/>
|
||||
<constraint firstAttribute="trailing" secondItem="yz7-y5-TxE" secondAttribute="trailing" constant="20" symbolic="YES" id="wma-6s-J2b"/>
|
||||
<constraint firstItem="Hoi-Pr-5wz" firstAttribute="top" secondItem="ggE-Pd-aWo" secondAttribute="bottom" constant="8" id="wr2-0t-CVH"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="nextKeyView" destination="yz7-y5-TxE" id="WHy-Vl-LGY"/>
|
||||
</connections>
|
||||
</customView>
|
||||
<menu id="vy8-Pj-2Jg">
|
||||
<items>
|
||||
<menuItem title="New Cursor" tag="-1" id="KQs-oD-CRg">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="addAction:" target="oUs-Nv-PHw" id="Vbo-8k-sGO"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Remove Cursor" tag="-1" id="gnE-s8-eO8">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="removeAction:" target="oUs-Nv-PHw" id="QmX-eg-rb3"/>
|
||||
<binding destination="oUs-Nv-PHw" name="enabled" keyPath="selectedObject" id="v5P-WH-Wea">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Duplicate" tag="-1" id="swO-bv-qRE">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="duplicateAction:" target="oUs-Nv-PHw" id="z4d-84-N6g"/>
|
||||
<binding destination="oUs-Nv-PHw" name="enabled" keyPath="selectedObject" id="Q5o-HW-cMv">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="NSAddTemplate" width="11" height="11"/>
|
||||
<image name="NSRemoveTemplate" width="11" height="11"/>
|
||||
</resources>
|
||||
</document>
|
||||
@@ -0,0 +1,303 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="16096" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="16096"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</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" customClass="NSObject"/>
|
||||
<window title="Mousecape" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="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="1417"/>
|
||||
<value key="minSize" type="size" width="502" height="310"/>
|
||||
<view key="contentView" id="2">
|
||||
<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="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"/>
|
||||
<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" rowHeight="72" rowSizeStyle="automatic" viewBased="YES" id="dPn-85-uPK">
|
||||
<rect key="frame" x="0.0" y="0.0" width="711" height="311"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<size key="intercellSpacing" width="3" height="12"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<tableColumns>
|
||||
<tableColumn width="708" minWidth="40" maxWidth="9999" id="CBK-sD-upn">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
|
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableHeaderCell>
|
||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="bXC-ob-CUQ">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="syZ-Eq-Lt2" customClass="MCCapeCellView">
|
||||
<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="56" width="96" height="16"/>
|
||||
<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"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="syZ-Eq-Lt2" name="value" keyPath="objectValue.name" id="YHc-x9-wXk"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="jdV-zx-iTs">
|
||||
<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="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">
|
||||
<string key="NSValueTransformerName">MCHDValueTransformer</string>
|
||||
</dictionary>
|
||||
</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="4" 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" wantsLayer="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" wantsLayer="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>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OUy-kz-p7o">
|
||||
<rect key="frame" x="118" y="58" width="15" height="11"/>
|
||||
<textFieldCell key="cell" lineBreakMode="clipping" title="by" id="jWt-I0-CSL">
|
||||
<font key="font" metaFont="label" size="9"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bEa-BS-ghQ">
|
||||
<rect key="frame" x="133" y="56" width="49" 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"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="syZ-Eq-Lt2" name="value" keyPath="objectValue.author" id="D3x-S0-YIW"/>
|
||||
</connections>
|
||||
</textField>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="Hfe-RO-hVE" firstAttribute="leading" secondItem="syZ-Eq-Lt2" secondAttribute="leading" constant="20" symbolic="YES" id="OHp-3c-ujO"/>
|
||||
<constraint firstItem="QMa-EX-Son" firstAttribute="leading" secondItem="jdV-zx-iTs" secondAttribute="trailing" constant="8" symbolic="YES" id="QfE-A7-Oc8"/>
|
||||
<constraint firstItem="jdV-zx-iTs" firstAttribute="centerY" secondItem="QMa-EX-Son" secondAttribute="centerY" id="YLI-IS-v1N"/>
|
||||
<constraint firstItem="bEa-BS-ghQ" firstAttribute="firstBaseline" secondItem="OUy-kz-p7o" secondAttribute="firstBaseline" id="Yif-mq-VLO"/>
|
||||
<constraint firstItem="bEa-BS-ghQ" firstAttribute="baseline" secondItem="Hfe-RO-hVE" secondAttribute="baseline" id="bCc-gQ-FVG"/>
|
||||
<constraint firstItem="bEa-BS-ghQ" firstAttribute="leading" secondItem="OUy-kz-p7o" secondAttribute="trailing" constant="4" id="eYj-8T-6Xr"/>
|
||||
<constraint firstItem="OUy-kz-p7o" firstAttribute="leading" secondItem="Hfe-RO-hVE" secondAttribute="trailing" constant="8" id="eeG-7o-lDi"/>
|
||||
<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"/>
|
||||
<constraint firstItem="OUy-kz-p7o" firstAttribute="firstBaseline" secondItem="Hfe-RO-hVE" secondAttribute="firstBaseline" id="yX1-CS-CfT"/>
|
||||
</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"/>
|
||||
</connections>
|
||||
</tableCellView>
|
||||
</prototypeCellViews>
|
||||
</tableColumn>
|
||||
</tableColumns>
|
||||
<connections>
|
||||
<outlet property="dataSource" destination="zL4-Ay-t4Q" id="0iM-HK-P70"/>
|
||||
<outlet property="delegate" destination="zL4-Ay-t4Q" id="riV-4x-e3X"/>
|
||||
<outlet property="menu" destination="zpf-M9-Nd1" id="lfG-VA-TTS"/>
|
||||
</connections>
|
||||
</tableView>
|
||||
</subviews>
|
||||
</clipView>
|
||||
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="uK0-YP-77b">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="q1a-eU-6AV">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
</scrollView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="2Io-MC-n6O" secondAttribute="bottom" id="Cbd-gK-nbr"/>
|
||||
<constraint firstItem="2Io-MC-n6O" firstAttribute="top" secondItem="2" secondAttribute="top" id="GZN-yG-wKe"/>
|
||||
<constraint firstAttribute="trailing" secondItem="2Io-MC-n6O" secondAttribute="trailing" id="Nej-8C-Hrd"/>
|
||||
<constraint firstItem="2Io-MC-n6O" firstAttribute="leading" secondItem="2" secondAttribute="leading" id="chC-8B-nJc"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="-2" id="4"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="-39" y="187"/>
|
||||
</window>
|
||||
<viewController title="Library" id="zL4-Ay-t4Q" customClass="MCLibraryViewController">
|
||||
<connections>
|
||||
<outlet property="contextMenu" destination="zpf-M9-Nd1" id="jgh-ez-9dF"/>
|
||||
<outlet property="tableView" destination="dPn-85-uPK" id="Gbg-WA-ju6"/>
|
||||
<outlet property="view" destination="2" id="zf4-7d-uPj"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<menu id="zpf-M9-Nd1">
|
||||
<items>
|
||||
<menuItem title="Apply" tag="-1" id="aI1-E0-bnW">
|
||||
<string key="keyEquivalent" base64-UTF8="YES">
|
||||
DQ
|
||||
</string>
|
||||
<connections>
|
||||
<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="editCapeAction:" target="-1" id="xUA-Zj-ToX"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Duplicate" tag="-1" keyEquivalent="S" id="PhG-Ll-nqz">
|
||||
<connections>
|
||||
<action selector="duplicateCapeAction:" target="-1" id="3xf-LP-P1p"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Remove" tag="-1" id="Aig-wl-ivn">
|
||||
<string key="keyEquivalent" base64-UTF8="YES">
|
||||
CA
|
||||
</string>
|
||||
<connections>
|
||||
<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="showCapeAction:" target="-1" id="iF0-eu-Du4"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
<point key="canvasLocation" x="9" y="-116"/>
|
||||
</menu>
|
||||
<customView id="3Ui-b0-Yod" userLabel="Accessory">
|
||||
<rect key="frame" x="0.0" y="0.0" width="251" height="21"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="cSP-XN-7we">
|
||||
<rect key="frame" x="-2" y="4" width="245" height="14"/>
|
||||
<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="message" size="11"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="backgroundStyle">
|
||||
<integer key="value" value="2"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="zL4-Ay-t4Q" name="value" keyPath="libraryController.appliedCape.name" id="tSr-qw-vw1">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">MCAppliedCapeValueTransformer</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</textField>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="cSP-XN-7we" secondAttribute="trailing" constant="10" id="OsL-1s-qgU"/>
|
||||
<constraint firstItem="cSP-XN-7we" firstAttribute="centerY" secondItem="3Ui-b0-Yod" secondAttribute="centerY" id="U7A-WI-2JG"/>
|
||||
<constraint firstItem="cSP-XN-7we" firstAttribute="leading" secondItem="3Ui-b0-Yod" secondAttribute="leading" id="eoA-bD-pz5"/>
|
||||
</constraints>
|
||||
<point key="canvasLocation" x="499" y="-594"/>
|
||||
</customView>
|
||||
<view id="smV-Cs-4aH">
|
||||
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<point key="canvasLocation" x="499" y="-311"/>
|
||||
</view>
|
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" releasedWhenClosed="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="1417"/>
|
||||
<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="348" height="20"/>
|
||||
</progressIndicator>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ui8-vk-7P8">
|
||||
<rect key="frame" x="369" y="22" width="70" height="16"/>
|
||||
<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="HDTemplate" width="30" height="18"/>
|
||||
<image name="applied" width="16" height="16"/>
|
||||
</resources>
|
||||
</document>
|
||||
@@ -0,0 +1,431 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6185.11" systemVersion="13E28" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6185.11"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
||||
<connections>
|
||||
<outlet property="delegate" destination="494" id="495"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<menu title="AMainMenu" systemMenu="main" id="29">
|
||||
<items>
|
||||
<menuItem title="Mousecape" id="56">
|
||||
<menu key="submenu" title="Mousecape" systemMenu="apple" id="57">
|
||||
<items>
|
||||
<menuItem title="About Mousecape" id="58">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="236">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</menuItem>
|
||||
<menuItem title="Preferences…" keyEquivalent="," id="129">
|
||||
<connections>
|
||||
<action selector="showPreferences:" target="-1" id="lNW-tH-IKS"/>
|
||||
</connections>
|
||||
</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"/>
|
||||
<connections>
|
||||
<action selector="toggleInstall:" target="-1" id="Ppc-Jw-bxU"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="143">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</menuItem>
|
||||
<menuItem title="Services" id="131">
|
||||
<menu key="submenu" title="Services" systemMenu="services" id="130"/>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="144">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</menuItem>
|
||||
<menuItem title="Hide Mousecape" keyEquivalent="h" id="134">
|
||||
<connections>
|
||||
<action selector="hide:" target="-1" id="367"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Hide Others" keyEquivalent="h" id="145">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="hideOtherApplications:" target="-1" id="368"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Show All" id="150">
|
||||
<connections>
|
||||
<action selector="unhideAllApplications:" target="-1" id="370"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="149">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</menuItem>
|
||||
<menuItem title="Quit Mousecape" keyEquivalent="q" id="136">
|
||||
<connections>
|
||||
<action selector="terminate:" target="-3" id="449"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="File" id="83">
|
||||
<menu key="submenu" title="File" id="81">
|
||||
<items>
|
||||
<menuItem title="New Cape" keyEquivalent="n" id="82">
|
||||
<connections>
|
||||
<action selector="newDocument:" target="-1" id="I3c-Gd-Cqc"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Import Cape" keyEquivalent="o" id="kdx-d9-Lek">
|
||||
<connections>
|
||||
<action selector="openDocument:" target="-1" id="2Qd-t2-zEv"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Import MightyMouse" keyEquivalent="i" id="l3B-n8-21Z">
|
||||
<connections>
|
||||
<action selector="convertCape:" target="494" id="vs2-8F-92y"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="79">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</menuItem>
|
||||
<menuItem title="Close" keyEquivalent="w" id="73">
|
||||
<connections>
|
||||
<action selector="performClose:" target="-1" id="193"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Save…" keyEquivalent="s" id="75">
|
||||
<connections>
|
||||
<action selector="saveDocument:" target="-1" id="362"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Revert to Saved" id="112">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="revertDocumentToSaved:" target="-1" id="364"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Edit" id="217">
|
||||
<menu key="submenu" title="Edit" id="205">
|
||||
<items>
|
||||
<menuItem title="Undo" keyEquivalent="z" id="207">
|
||||
<connections>
|
||||
<action selector="undo:" target="-1" id="223"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Redo" keyEquivalent="Z" id="215">
|
||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="redo:" target="-1" id="231"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="206">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</menuItem>
|
||||
<menuItem title="Cut" keyEquivalent="x" id="199">
|
||||
<connections>
|
||||
<action selector="cut:" target="-1" id="228"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Copy" keyEquivalent="c" id="197">
|
||||
<connections>
|
||||
<action selector="copy:" target="-1" id="224"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Paste" keyEquivalent="v" id="203">
|
||||
<connections>
|
||||
<action selector="paste:" target="-1" id="226"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Paste and Match Style" keyEquivalent="V" id="485">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="pasteAsPlainText:" target="-1" id="486"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Delete" id="202">
|
||||
<connections>
|
||||
<action selector="delete:" target="-1" id="235"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Select All" keyEquivalent="a" id="198">
|
||||
<connections>
|
||||
<action selector="selectAll:" target="-1" id="232"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="214">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</menuItem>
|
||||
<menuItem title="Find" id="218">
|
||||
<menu key="submenu" title="Find" id="220">
|
||||
<items>
|
||||
<menuItem title="Find…" tag="1" keyEquivalent="f" id="209">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="241"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="535"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="487"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213">
|
||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="488"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Use Selection for Find" tag="7" id="221">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="489"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Jump to Selection" keyEquivalent="j" id="210">
|
||||
<connections>
|
||||
<action selector="centerSelectionInVisibleArea:" target="-1" id="245"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Spelling and Grammar" id="216">
|
||||
<menu key="submenu" title="Spelling and Grammar" id="200">
|
||||
<items>
|
||||
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204">
|
||||
<connections>
|
||||
<action selector="showGuessPanel:" target="-1" id="230"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Check Document Now" keyEquivalent=";" id="201">
|
||||
<connections>
|
||||
<action selector="checkSpelling:" target="-1" id="225"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="453"/>
|
||||
<menuItem title="Check Spelling While Typing" id="219">
|
||||
<connections>
|
||||
<action selector="toggleContinuousSpellChecking:" target="-1" id="222"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Check Grammar With Spelling" id="346">
|
||||
<connections>
|
||||
<action selector="toggleGrammarChecking:" target="-1" id="347"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Correct Spelling Automatically" id="454">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="456"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Substitutions" id="348">
|
||||
<menu key="submenu" title="Substitutions" id="349">
|
||||
<items>
|
||||
<menuItem title="Show Substitutions" id="457">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="458"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="459"/>
|
||||
<menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350">
|
||||
<connections>
|
||||
<action selector="toggleSmartInsertDelete:" target="-1" id="355"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351">
|
||||
<connections>
|
||||
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="356"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Smart Dashes" id="460">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="461"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354">
|
||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticLinkDetection:" target="-1" id="357"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Text Replacement" id="462">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticTextReplacement:" target="-1" id="463"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Transformations" id="450">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Transformations" id="451">
|
||||
<items>
|
||||
<menuItem title="Make Upper Case" id="452">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="uppercaseWord:" target="-1" id="464"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Make Lower Case" id="465">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="lowercaseWord:" target="-1" id="468"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Capitalize" id="466">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="capitalizeWord:" target="-1" id="467"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Speech" id="211">
|
||||
<menu key="submenu" title="Speech" id="212">
|
||||
<items>
|
||||
<menuItem title="Start Speaking" id="196">
|
||||
<connections>
|
||||
<action selector="startSpeaking:" target="-1" id="233"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Stop Speaking" id="195">
|
||||
<connections>
|
||||
<action selector="stopSpeaking:" target="-1" id="227"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Capes" id="g8O-f8-aKi">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Capes" id="ttR-pS-Pk1">
|
||||
<items>
|
||||
<menuItem title="Apply Cape" id="ieJ-T1-eH7">
|
||||
<string key="keyEquivalent" base64-UTF8="YES">
|
||||
DQ
|
||||
</string>
|
||||
<connections>
|
||||
<action selector="applyCapeAction:" target="-1" id="RAI-pM-j7M"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Edit Cape" keyEquivalent="e" id="5qb-Dw-38q">
|
||||
<connections>
|
||||
<action selector="editCapeAction:" target="-1" id="E2d-D2-Hj9"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Remove Cape" id="LHh-1u-bK8">
|
||||
<string key="keyEquivalent" base64-UTF8="YES">
|
||||
CA
|
||||
</string>
|
||||
<connections>
|
||||
<action selector="removeCapeAction:" target="-1" id="RE5-YE-iAt"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Duplicate Cape" keyEquivalent="S" id="d9b-6w-ubr">
|
||||
<connections>
|
||||
<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="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="showCapeAction:" target="-1" id="9mC-pd-eiq"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Restore Defaults" keyEquivalent="r" id="uCE-YB-8VL">
|
||||
<connections>
|
||||
<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>
|
||||
<menuItem title="Window" id="19">
|
||||
<menu key="submenu" title="Window" systemMenu="window" id="24">
|
||||
<items>
|
||||
<menuItem title="Minimize" keyEquivalent="m" id="23">
|
||||
<connections>
|
||||
<action selector="performMiniaturize:" target="-1" id="37"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Zoom" id="239">
|
||||
<connections>
|
||||
<action selector="performZoom:" target="-1" id="240"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="92">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</menuItem>
|
||||
<menuItem title="Bring All to Front" id="5">
|
||||
<connections>
|
||||
<action selector="arrangeInFront:" target="-1" id="39"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Help" id="490">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Help" systemMenu="help" id="491">
|
||||
<items>
|
||||
<menuItem title="Mousecape Help" keyEquivalent="?" id="492">
|
||||
<connections>
|
||||
<action selector="showHelp:" target="-1" id="493"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
<customObject id="494" customClass="MCAppDelegate">
|
||||
<connections>
|
||||
<outlet property="toggleHelperItem" destination="Ui2-VN-tbP" id="31d-Xd-wNX"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="420" customClass="NSFontManager"/>
|
||||
<customObject id="1HC-av-0d2" customClass="SUUpdater"/>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -0,0 +1,32 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf100
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
{\*\expandedcolortbl;;}
|
||||
\vieww9600\viewh8400\viewkind0
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\partightenfactor0
|
||||
|
||||
\f0\b\fs24 \cf0 Engineering:
|
||||
\f1\b0 \
|
||||
Alex Zielenski\
|
||||
{\field{\*\fldinst{HYPERLINK "http://alexzielenski.com"}}{\fldrslt http://alexzielenski.com}}\
|
||||
\
|
||||
|
||||
\f0\b Icon:\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0
|
||||
|
||||
\f1\b0 \cf0 Allan Nyholm Nielson\
|
||||
{\field{\*\fldinst{HYPERLINK "https://www.deviantart.com/allannyholm"}}{\fldrslt https://www.deviantart.com/allannyholm}}\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\partightenfactor0
|
||||
\cf0 \
|
||||
|
||||
\f0\b Testing:
|
||||
\f1\b0 \
|
||||
Justin Ayles\
|
||||
\
|
||||
|
||||
\f0\b With special thanks to:
|
||||
\f1\b0 \
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\partightenfactor0
|
||||
{\field{\*\fldinst{HYPERLINK "http://maxrudberg.com"}}{\fldrslt \cf0 Max Rudberg}}\
|
||||
Mom & Dad\
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
/*
|
||||
Localizable.strings
|
||||
Mousecape
|
||||
|
||||
Created by Alexander Zielenski on 6/13/20.
|
||||
Copyright © 2020 Alex Zielenski. All rights reserved.
|
||||
*/
|
||||
@@ -0,0 +1,4 @@
|
||||
/* Bundle name */
|
||||
"CFBundleName" = "com.alexzielenski.mousecloakhelper";
|
||||
/* Copyright (human-readable) */
|
||||
"NSHumanReadableCopyright" = "Copyright © 2014 Alex Zielenski. All rights reserved.";
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"developmentRegion" : "en",
|
||||
"targetLocale" : "en",
|
||||
"toolInfo" : {
|
||||
"toolBuildNumber" : "11E503a",
|
||||
"toolID" : "com.apple.dt.xcode",
|
||||
"toolName" : "Xcode",
|
||||
"toolVersion" : "11.4.1"
|
||||
},
|
||||
"version" : "1.0"
|
||||
}
|
||||
@@ -1,29 +1,32 @@
|
||||
{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf2512
|
||||
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\paperw9840\paperh8400
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
|
||||
{\*\expandedcolortbl;;}
|
||||
\vieww9600\viewh8400\viewkind0
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\partightenfactor0
|
||||
|
||||
\f0\b\fs24 \cf0 Engineering:
|
||||
\b0 \
|
||||
Some people\
|
||||
\f1\b0 \
|
||||
Alex Zielenski\
|
||||
{\field{\*\fldinst{HYPERLINK "http://alexzielenski.com"}}{\fldrslt http://alexzielenski.com}}\
|
||||
\
|
||||
|
||||
\b Human Interface Design:
|
||||
\b0 \
|
||||
Some other people\
|
||||
\f0\b Icons and Testing:\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0
|
||||
|
||||
\f1\b0 \cf0 Allan Nyholm Nielsen\
|
||||
{\field{\*\fldinst{HYPERLINK "https://www.deviantart.com/allannyholm"}}{\fldrslt https://www.deviantart.com/allannyholm}}\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\partightenfactor0
|
||||
\cf0 \
|
||||
|
||||
\f0\b Testing:
|
||||
\f1\b0 \
|
||||
Justin Ayles\
|
||||
\
|
||||
|
||||
\b Testing:
|
||||
\b0 \
|
||||
Hopefully not nobody\
|
||||
\
|
||||
|
||||
\b Documentation:
|
||||
\b0 \
|
||||
Whoever\
|
||||
\
|
||||
|
||||
\b With special thanks to:
|
||||
\b0 \
|
||||
Mom\
|
||||
}
|
||||
\f0\b With special thanks to:
|
||||
\f1\b0 \
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\partightenfactor0
|
||||
{\field{\*\fldinst{HYPERLINK "http://maxrudberg.com"}}{\fldrslt \cf0 Max Rudberg}}\
|
||||
Mom & Dad\
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
|
||||
/* Class = "NSWindow"; title = "Window"; ObjectID = "1"; */
|
||||
"1.title" = "Window";
|
||||
|
||||
/* Class = "CocoaBindingsConnection"; ibShadowedIsNilPlaceholder = "Unknown"; ObjectID = "2aq-Lm-1Lm"; */
|
||||
"2aq-Lm-1Lm.ibShadowedIsNilPlaceholder" = "Unknown";
|
||||
|
||||
/* Class = "CocoaBindingsConnection"; ibShadowedMultipleValuesPlaceholder = "Unknown"; ObjectID = "2aq-Lm-1Lm"; */
|
||||
"2aq-Lm-1Lm.ibShadowedMultipleValuesPlaceholder" = "Unknown";
|
||||
|
||||
/* Class = "CocoaBindingsConnection"; ibShadowedNoSelectionPlaceholder = "Unknown"; ObjectID = "2aq-Lm-1Lm"; */
|
||||
"2aq-Lm-1Lm.ibShadowedNoSelectionPlaceholder" = "Unknown";
|
||||
|
||||
/* Class = "CocoaBindingsConnection"; ibShadowedNotApplicablePlaceholder = "Unknown"; ObjectID = "2aq-Lm-1Lm"; */
|
||||
"2aq-Lm-1Lm.ibShadowedNotApplicablePlaceholder" = "Unknown";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "5x"; ObjectID = "4fS-Q1-prn"; */
|
||||
"4fS-Q1-prn.title" = "5x";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Frame Duration:"; ObjectID = "5Wb-pc-8jV"; */
|
||||
"5Wb-pc-8jV.title" = "Frame Duration:";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "8bB-Ws-20v"; */
|
||||
"8bB-Ws-20v.title" = "Table View Cell";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "10x"; ObjectID = "8fp-Ws-ruA"; */
|
||||
"8fp-Ws-ruA.title" = "10x";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "8we-kW-bNk"; */
|
||||
"8we-kW-bNk.title" = "Table View Cell";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Version:"; ObjectID = "98i-gH-tf4"; */
|
||||
"98i-gH-tf4.title" = "Version:";
|
||||
|
||||
/* Class = "NSTextFieldCell"; placeholderString = "{0,0}"; ObjectID = "BWu-hw-sDX"; */
|
||||
"BWu-hw-sDX.placeholderString" = "{0,0}";
|
||||
|
||||
/* Class = "NSViewController"; title = "Cape"; ObjectID = "Bu6-lg-x1j"; */
|
||||
"Bu6-lg-x1j.title" = "Cape";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "EOd-L3-If3"; */
|
||||
"EOd-L3-If3.title" = "Text Cell";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "1x"; ObjectID = "FZ3-qB-kDI"; */
|
||||
"FZ3-qB-kDI.title" = "1x";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Size:"; ObjectID = "FrC-7p-0Bq"; */
|
||||
"FrC-7p-0Bq.title" = "Size:";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Frames:"; ObjectID = "G4c-OI-avP"; */
|
||||
"G4c-OI-avP.title" = "Frames:";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Retina:"; ObjectID = "HFS-GR-guB"; */
|
||||
"HFS-GR-guB.title" = "Retina:";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "New Cursor"; ObjectID = "KQs-oD-CRg"; */
|
||||
"KQs-oD-CRg.title" = "New Cursor";
|
||||
|
||||
/* Class = "NSTextFieldCell"; placeholderString = "{0,0}"; ObjectID = "OmM-g8-Kyd"; */
|
||||
"OmM-g8-Kyd.placeholderString" = "{0,0}";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Author:"; ObjectID = "Oyi-AW-60U"; */
|
||||
"Oyi-AW-60U.title" = "Author:";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "2x"; ObjectID = "WI8-sV-4D6"; */
|
||||
"WI8-sV-4D6.title" = "2x";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Identifier:"; ObjectID = "Xzj-Uq-4bW"; */
|
||||
"Xzj-Uq-4bW.title" = "Identifier:";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Hot Spot:"; ObjectID = "dcq-3r-2DB"; */
|
||||
"dcq-3r-2DB.title" = "Hot Spot:";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Type:"; ObjectID = "dy9-JM-4d7"; */
|
||||
"dy9-JM-4d7.title" = "Type:";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Remove Cursor"; ObjectID = "gnE-s8-eO8"; */
|
||||
"gnE-s8-eO8.title" = "Remove Cursor";
|
||||
|
||||
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "j3S-Me-3x5"; */
|
||||
"j3S-Me-3x5.title" = "OtherViews";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Name:"; ObjectID = "oMS-dL-nZj"; */
|
||||
"oMS-dL-nZj.title" = "Name:";
|
||||
|
||||
/* Class = "NSViewController"; title = "List"; ObjectID = "oUs-Nv-PHw"; */
|
||||
"oUs-Nv-PHw.title" = "List";
|
||||
|
||||
/* Class = "NSTextFieldCell"; placeholderString = "0.0"; ObjectID = "pqX-MB-QME"; */
|
||||
"pqX-MB-QME.placeholderString" = "0.0";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Duplicate"; ObjectID = "swO-bv-qRE"; */
|
||||
"swO-bv-qRE.title" = "Duplicate";
|
||||
|
||||
/* Class = "NSTextFieldCell"; placeholderString = "1"; ObjectID = "tKY-dX-ibT"; */
|
||||
"tKY-dX-ibT.placeholderString" = "1";
|
||||
|
||||
/* Class = "NSViewController"; title = "Detail"; ObjectID = "tMj-cQ-hK0"; */
|
||||
"tMj-cQ-hK0.title" = "Detail";
|
||||
@@ -0,0 +1,42 @@
|
||||
|
||||
/* Class = "NSWindow"; title = "Mousecape"; ObjectID = "1"; */
|
||||
"1.title" = "Mousecape";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "0kt-g0-cQb"; */
|
||||
"0kt-g0-cQb.title" = "Table View Cell";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show in Finder"; ObjectID = "2WM-EN-kiI"; */
|
||||
"2WM-EN-kiI.title" = "Show in Finder";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Remove"; ObjectID = "Aig-wl-ivn"; */
|
||||
"Aig-wl-ivn.title" = "Remove";
|
||||
|
||||
/* Class = "NSWindow"; title = "Window"; ObjectID = "DeD-dq-yBF"; */
|
||||
"DeD-dq-yBF.title" = "Window";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Edit"; ObjectID = "HJc-SX-JjZ"; */
|
||||
"HJc-SX-JjZ.title" = "Edit";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Subtitle"; ObjectID = "NXa-Ze-OX2"; */
|
||||
"NXa-Ze-OX2.title" = "Subtitle";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Duplicate"; ObjectID = "PhG-Ll-nqz"; */
|
||||
"PhG-Ll-nqz.title" = "Duplicate";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Apply"; ObjectID = "aI1-E0-bnW"; */
|
||||
"aI1-E0-bnW.title" = "Apply";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "bXC-ob-CUQ"; */
|
||||
"bXC-ob-CUQ.title" = "Text Cell";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "by"; ObjectID = "jWt-I0-CSL"; */
|
||||
"jWt-I0-CSL.title" = "by";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "000 of 129"; ObjectID = "sq0-HM-mp6"; */
|
||||
"sq0-HM-mp6.title" = "000 of 129";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Applied Cursor: None"; ObjectID = "vZ3-2R-psO"; */
|
||||
"vZ3-2R-psO.title" = "Applied Cursor: None";
|
||||
|
||||
/* Class = "NSViewController"; title = "Library"; ObjectID = "zL4-Ay-t4Q"; */
|
||||
"zL4-Ay-t4Q.title" = "Library";
|
||||
@@ -0,0 +1,243 @@
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "5"; */
|
||||
"5.title" = "Bring All to Front";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Window"; ObjectID = "19"; */
|
||||
"19.title" = "Window";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "23"; */
|
||||
"23.title" = "Minimize";
|
||||
|
||||
/* Class = "NSMenu"; title = "Window"; ObjectID = "24"; */
|
||||
"24.title" = "Window";
|
||||
|
||||
/* Class = "NSMenu"; title = "AMainMenu"; ObjectID = "29"; */
|
||||
"29.title" = "AMainMenu";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Mousecape"; ObjectID = "56"; */
|
||||
"56.title" = "Mousecape";
|
||||
|
||||
/* Class = "NSMenu"; title = "Mousecape"; ObjectID = "57"; */
|
||||
"57.title" = "Mousecape";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "About Mousecape"; ObjectID = "58"; */
|
||||
"58.title" = "About Mousecape";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Close"; ObjectID = "73"; */
|
||||
"73.title" = "Close";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Save…"; ObjectID = "75"; */
|
||||
"75.title" = "Save…";
|
||||
|
||||
/* Class = "NSMenu"; title = "File"; ObjectID = "81"; */
|
||||
"81.title" = "File";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "New Cape"; ObjectID = "82"; */
|
||||
"82.title" = "New Cape";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "File"; ObjectID = "83"; */
|
||||
"83.title" = "File";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "112"; */
|
||||
"112.title" = "Revert to Saved";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "129"; */
|
||||
"129.title" = "Preferences…";
|
||||
|
||||
/* Class = "NSMenu"; title = "Services"; ObjectID = "130"; */
|
||||
"130.title" = "Services";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Services"; ObjectID = "131"; */
|
||||
"131.title" = "Services";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Hide Mousecape"; ObjectID = "134"; */
|
||||
"134.title" = "Hide Mousecape";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Quit Mousecape"; ObjectID = "136"; */
|
||||
"136.title" = "Quit Mousecape";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "145"; */
|
||||
"145.title" = "Hide Others";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show All"; ObjectID = "150"; */
|
||||
"150.title" = "Show All";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "195"; */
|
||||
"195.title" = "Stop Speaking";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "196"; */
|
||||
"196.title" = "Start Speaking";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Copy"; ObjectID = "197"; */
|
||||
"197.title" = "Copy";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Select All"; ObjectID = "198"; */
|
||||
"198.title" = "Select All";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Cut"; ObjectID = "199"; */
|
||||
"199.title" = "Cut";
|
||||
|
||||
/* Class = "NSMenu"; title = "Spelling and Grammar"; ObjectID = "200"; */
|
||||
"200.title" = "Spelling and Grammar";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "201"; */
|
||||
"201.title" = "Check Document Now";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Delete"; ObjectID = "202"; */
|
||||
"202.title" = "Delete";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Paste"; ObjectID = "203"; */
|
||||
"203.title" = "Paste";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "204"; */
|
||||
"204.title" = "Show Spelling and Grammar";
|
||||
|
||||
/* Class = "NSMenu"; title = "Edit"; ObjectID = "205"; */
|
||||
"205.title" = "Edit";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "207"; */
|
||||
"207.title" = "Undo";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "208"; */
|
||||
"208.title" = "Find Next";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find…"; ObjectID = "209"; */
|
||||
"209.title" = "Find…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "210"; */
|
||||
"210.title" = "Jump to Selection";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Speech"; ObjectID = "211"; */
|
||||
"211.title" = "Speech";
|
||||
|
||||
/* Class = "NSMenu"; title = "Speech"; ObjectID = "212"; */
|
||||
"212.title" = "Speech";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "213"; */
|
||||
"213.title" = "Find Previous";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "215"; */
|
||||
"215.title" = "Redo";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "216"; */
|
||||
"216.title" = "Spelling and Grammar";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Edit"; ObjectID = "217"; */
|
||||
"217.title" = "Edit";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find"; ObjectID = "218"; */
|
||||
"218.title" = "Find";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "219"; */
|
||||
"219.title" = "Check Spelling While Typing";
|
||||
|
||||
/* Class = "NSMenu"; title = "Find"; ObjectID = "220"; */
|
||||
"220.title" = "Find";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "221"; */
|
||||
"221.title" = "Use Selection for Find";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "239"; */
|
||||
"239.title" = "Zoom";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "346"; */
|
||||
"346.title" = "Check Grammar With Spelling";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "348"; */
|
||||
"348.title" = "Substitutions";
|
||||
|
||||
/* Class = "NSMenu"; title = "Substitutions"; ObjectID = "349"; */
|
||||
"349.title" = "Substitutions";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "350"; */
|
||||
"350.title" = "Smart Copy/Paste";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "351"; */
|
||||
"351.title" = "Smart Quotes";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "354"; */
|
||||
"354.title" = "Smart Links";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "450"; */
|
||||
"450.title" = "Transformations";
|
||||
|
||||
/* Class = "NSMenu"; title = "Transformations"; ObjectID = "451"; */
|
||||
"451.title" = "Transformations";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "452"; */
|
||||
"452.title" = "Make Upper Case";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "454"; */
|
||||
"454.title" = "Correct Spelling Automatically";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "457"; */
|
||||
"457.title" = "Show Substitutions";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "460"; */
|
||||
"460.title" = "Smart Dashes";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "462"; */
|
||||
"462.title" = "Text Replacement";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "465"; */
|
||||
"465.title" = "Make Lower Case";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "466"; */
|
||||
"466.title" = "Capitalize";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "485"; */
|
||||
"485.title" = "Paste and Match Style";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Help"; ObjectID = "490"; */
|
||||
"490.title" = "Help";
|
||||
|
||||
/* Class = "NSMenu"; title = "Help"; ObjectID = "491"; */
|
||||
"491.title" = "Help";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Mousecape Help"; ObjectID = "492"; */
|
||||
"492.title" = "Mousecape Help";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "534"; */
|
||||
"534.title" = "Find and Replace…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Edit Cape"; ObjectID = "5qb-Dw-38q"; */
|
||||
"5qb-Dw-38q.title" = "Edit Cape";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Dump Cursors…"; ObjectID = "CYY-iE-0bP"; */
|
||||
"CYY-iE-0bP.title" = "Dump Cursors…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Remove Cape"; ObjectID = "LHh-1u-bK8"; */
|
||||
"LHh-1u-bK8.title" = "Remove Cape";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show in Finder"; ObjectID = "PAd-kz-Eoi"; */
|
||||
"PAd-kz-Eoi.title" = "Show in Finder";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Install Helper Tool"; ObjectID = "Ui2-VN-tbP"; */
|
||||
"Ui2-VN-tbP.title" = "Install Helper Tool";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Check for Updates"; ObjectID = "XTi-86-ese"; */
|
||||
"XTi-86-ese.title" = "Check for Updates";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Duplicate Cape"; ObjectID = "d9b-6w-ubr"; */
|
||||
"d9b-6w-ubr.title" = "Duplicate Cape";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Capes"; ObjectID = "g8O-f8-aKi"; */
|
||||
"g8O-f8-aKi.title" = "Capes";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Apply Cape"; ObjectID = "ieJ-T1-eH7"; */
|
||||
"ieJ-T1-eH7.title" = "Apply Cape";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Check for Updates..."; ObjectID = "igk-i0-oH0"; */
|
||||
"igk-i0-oH0.title" = "Check for Updates...";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Import Cape"; ObjectID = "kdx-d9-Lek"; */
|
||||
"kdx-d9-Lek.title" = "Import Cape";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Import MightyMouse"; ObjectID = "l3B-n8-21Z"; */
|
||||
"l3B-n8-21Z.title" = "Import MightyMouse";
|
||||
|
||||
/* Class = "NSMenu"; title = "Capes"; ObjectID = "ttR-pS-Pk1"; */
|
||||
"ttR-pS-Pk1.title" = "Capes";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Restore Defaults"; ObjectID = "uCE-YB-8VL"; */
|
||||
"uCE-YB-8VL.title" = "Restore Defaults";
|
||||
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// DTScrollView.h
|
||||
// iCatalogEditor
|
||||
//
|
||||
// Created by Oliver Drobnik on 10/23/12.
|
||||
// Copyright (c) 2012 Cocoanetics. All rights reserved.
|
||||
//
|
||||
|
||||
#import "RBLScrollView.h"
|
||||
|
||||
/**
|
||||
A scroll view that forwards scroll events up the responder chain if scrolling is along an axis that no scroll bar is shown for. This is useful to have a horizontal scroll view contained in a vertical one. To enable, set usesPredominantAxisScrolling to YES and hide the scroll bar for the axis you don't want to support.
|
||||
*/
|
||||
@interface DTScrollView : RBLScrollView
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,33 @@
|
||||
//
|
||||
// DTScrollView.m
|
||||
// iCatalogEditor
|
||||
//
|
||||
// Created by Oliver Drobnik on 10/23/12.
|
||||
// Copyright (c) 2012 Cocoanetics. All rights reserved.
|
||||
//
|
||||
|
||||
#import "DTScrollView.h"
|
||||
|
||||
@implementation DTScrollView
|
||||
|
||||
- (void)scrollWheel:(NSEvent *)theEvent {
|
||||
|
||||
BOOL shouldForwardScroll = NO;
|
||||
|
||||
if (self.usesPredominantAxisScrolling) {
|
||||
if (fabs(theEvent.deltaX) < fabs(theEvent.deltaY)) {
|
||||
// vertical scroll
|
||||
if (!self.hasVerticalScroller) {
|
||||
shouldForwardScroll = YES;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (shouldForwardScroll) {
|
||||
[[self nextResponder] scrollWheel:theEvent];
|
||||
} else {
|
||||
[super scrollWheel:theEvent];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,32 +1,29 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
|
||||
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
|
||||
<data>
|
||||
<int key="IBDocument.SystemTarget">1080</int>
|
||||
<string key="IBDocument.SystemVersion">12E55</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">3084</string>
|
||||
<string key="IBDocument.AppKitVersion">1187.39</string>
|
||||
<string key="IBDocument.HIToolboxVersion">626.00</string>
|
||||
<int key="IBDocument.SystemTarget">1090</int>
|
||||
<string key="IBDocument.SystemVersion">14A261i</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">6154.17</string>
|
||||
<string key="IBDocument.AppKitVersion">1321.11</string>
|
||||
<string key="IBDocument.HIToolboxVersion">737.00</string>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="NS.object.0">3084</string>
|
||||
<string key="NS.object.0">6154.17</string>
|
||||
</object>
|
||||
<object class="NSArray" key="IBDocument.IntegratedClassDependencies">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<array key="IBDocument.IntegratedClassDependencies">
|
||||
<string>NSCustomObject</string>
|
||||
<string>NSToolbar</string>
|
||||
<string>NSView</string>
|
||||
<string>NSWindowTemplate</string>
|
||||
</object>
|
||||
<object class="NSArray" key="IBDocument.PluginDependencies">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</array>
|
||||
<array key="IBDocument.PluginDependencies">
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</object>
|
||||
</array>
|
||||
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
||||
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
|
||||
<integer value="1" key="NS.object.0"/>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
|
||||
<object class="NSCustomObject" id="1001">
|
||||
<string key="NSClassName">MASPreferencesWindowController</string>
|
||||
</object>
|
||||
@@ -42,11 +39,9 @@
|
||||
<string key="NSWindowRect">{{540, 400}, {360, 270}}</string>
|
||||
<int key="NSWTFlags">1618478080</int>
|
||||
<string key="NSWindowTitle"/>
|
||||
<string key="NSWindowClass">NSWindow</string>
|
||||
<string key="NSWindowClass">NSPanel</string>
|
||||
<object class="NSToolbar" key="NSViewClass" id="693562270">
|
||||
<object class="NSMutableString" key="NSToolbarIdentifier">
|
||||
<characters key="NS.bytes">A3419266-C6CB-4FAA-AB63-B91B70C196EA</characters>
|
||||
</object>
|
||||
<string key="NSToolbarIdentifier">45E11247-C0D1-4D0A-A5E9-F1307B14CEF7</string>
|
||||
<nil key="NSToolbarDelegate"/>
|
||||
<bool key="NSToolbarPrefersToBeShown">YES</bool>
|
||||
<bool key="NSToolbarShowsBaselineSeparator">YES</bool>
|
||||
@@ -54,14 +49,8 @@
|
||||
<bool key="NSToolbarAutosavesConfiguration">NO</bool>
|
||||
<int key="NSToolbarDisplayMode">1</int>
|
||||
<int key="NSToolbarSizeMode">1</int>
|
||||
<object class="NSMutableDictionary" key="NSToolbarIBIdentifiedItems">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys" id="0">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<reference key="dict.values" ref="0"/>
|
||||
</object>
|
||||
<reference key="NSToolbarIBAllowedItems" ref="0"/>
|
||||
<dictionary class="NSMutableDictionary" key="NSToolbarIBIdentifiedItems"/>
|
||||
<array key="NSToolbarIBAllowedItems" id="0"/>
|
||||
<reference key="NSToolbarIBDefaultItems" ref="0"/>
|
||||
<reference key="NSToolbarIBSelectableItems" ref="0"/>
|
||||
</object>
|
||||
@@ -74,15 +63,14 @@
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView"/>
|
||||
</object>
|
||||
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
|
||||
<string key="NSScreenRect">{{0, 0}, {2560, 1417}}</string>
|
||||
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
|
||||
<string key="NSFrameAutosaveName"/>
|
||||
<bool key="NSWindowIsRestorable">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
||||
<object class="NSMutableArray" key="connectionRecords">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<array class="NSMutableArray" key="connectionRecords">
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBOutletConnection" key="connection">
|
||||
<string key="label">window</string>
|
||||
@@ -115,10 +103,9 @@
|
||||
</object>
|
||||
<int key="connectionID">22</int>
|
||||
</object>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||
<object class="NSArray" key="orderedObjects">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<array key="orderedObjects">
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">0</int>
|
||||
<reference key="object" ref="0"/>
|
||||
@@ -146,11 +133,10 @@
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">1</int>
|
||||
<reference key="object" ref="1005"/>
|
||||
<object class="NSMutableArray" key="children">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<array class="NSMutableArray" key="children">
|
||||
<reference ref="1006"/>
|
||||
<reference ref="693562270"/>
|
||||
</object>
|
||||
</array>
|
||||
<reference key="parent" ref="0"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
@@ -161,106 +147,123 @@
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">4</int>
|
||||
<reference key="object" ref="693562270"/>
|
||||
<object class="NSMutableArray" key="children">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<reference key="parent" ref="1005"/>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="flattenedProperties">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>-1.IBPluginDependency</string>
|
||||
<string>-2.IBPluginDependency</string>
|
||||
<string>-3.IBPluginDependency</string>
|
||||
<string>1.IBNSWindowAutoPositionCentersHorizontal</string>
|
||||
<string>1.IBNSWindowAutoPositionCentersVertical</string>
|
||||
<string>1.IBPluginDependency</string>
|
||||
<string>1.IBWindowTemplateEditedContentRect</string>
|
||||
<string>1.NSWindowTemplate.visibleAtLaunch</string>
|
||||
<string>2.IBPluginDependency</string>
|
||||
<string>4.IBPluginDependency</string>
|
||||
</object>
|
||||
<object class="NSArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<boolean value="NO"/>
|
||||
<boolean value="NO"/>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>{{484, 402}, {360, 270}}</string>
|
||||
<boolean value="NO"/>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="unlocalizedProperties">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference key="dict.sortedKeys" ref="0"/>
|
||||
<reference key="dict.values" ref="0"/>
|
||||
</array>
|
||||
</object>
|
||||
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
||||
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<boolean value="NO" key="1.IBNSWindowAutoPositionCentersHorizontal"/>
|
||||
<boolean value="NO" key="1.IBNSWindowAutoPositionCentersVertical"/>
|
||||
<string key="1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="1.IBWindowTemplateEditedContentRect">{{484, 402}, {360, 270}}</string>
|
||||
<boolean value="NO" key="1.NSWindowTemplate.visibleAtLaunch"/>
|
||||
<string key="2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="4.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
|
||||
<nil key="activeLocalization"/>
|
||||
<object class="NSMutableDictionary" key="localizations">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference key="dict.sortedKeys" ref="0"/>
|
||||
<reference key="dict.values" ref="0"/>
|
||||
</object>
|
||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">23</int>
|
||||
<int key="maxID">27</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">FirstResponder</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBUserSource</string>
|
||||
<string key="minorKey"/>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">MASPreferencesWindowController</string>
|
||||
<string key="superclassName">NSWindowController</string>
|
||||
<object class="NSMutableDictionary" key="actions">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>goNextTab:</string>
|
||||
<string>goPreviousTab:</string>
|
||||
<dictionary class="NSMutableDictionary" key="actions">
|
||||
<string key="goNextTab:">id</string>
|
||||
<string key="goPreviousTab:">id</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
||||
<object class="IBActionInfo" key="goNextTab:" id="26850041">
|
||||
<string key="name">goNextTab:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
<object class="NSArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>id</string>
|
||||
<string>id</string>
|
||||
<object class="IBActionInfo" key="goPreviousTab:" id="235845889">
|
||||
<string key="name">goPreviousTab:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
</dictionary>
|
||||
<object class="NSMutableDictionary" key="outlets">
|
||||
<string key="NS.key.0">toolbar</string>
|
||||
<string key="NS.object.0">NSToolbar</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<string key="NS.key.0">toolbar</string>
|
||||
<object class="IBToOneOutletInfo" key="NS.object.0" id="206441091">
|
||||
<string key="name">toolbar</string>
|
||||
<string key="candidateClassName">NSToolbar</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="actionInfosByName">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>goNextTab:</string>
|
||||
<string>goPreviousTab:</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">../Mousecape/external/MASPreferences/MASPreferencesWindowController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">MASPreferencesWindowController</string>
|
||||
<dictionary class="NSMutableDictionary" key="actions">
|
||||
<string key="goNextTab:">id</string>
|
||||
<string key="goPreviousTab:">id</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
||||
<object class="IBActionInfo" key="goNextTab:">
|
||||
<string key="name">goNextTab:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
<object class="NSArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBActionInfo">
|
||||
<string key="name">goNextTab:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
<object class="IBActionInfo">
|
||||
<string key="name">goPreviousTab:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
<object class="IBActionInfo" key="goPreviousTab:">
|
||||
<string key="name">goPreviousTab:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
</dictionary>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">../Mousecape/external/MASPreferences/MASPreferencesWindowController.m</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">MASPreferencesWindowController</string>
|
||||
<string key="superclassName">NSWindowController</string>
|
||||
<dictionary class="NSMutableDictionary" key="actions">
|
||||
<string key="goNextTab:">id</string>
|
||||
<string key="goPreviousTab:">id</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
||||
<reference key="goNextTab:" ref="26850041"/>
|
||||
<reference key="goPreviousTab:" ref="235845889"/>
|
||||
</dictionary>
|
||||
<object class="NSMutableDictionary" key="outlets">
|
||||
<string key="NS.key.0">toolbar</string>
|
||||
<string key="NS.object.0">NSToolbar</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<string key="NS.key.0">toolbar</string>
|
||||
<reference key="NS.object.0" ref="206441091"/>
|
||||
</object>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">./Classes/MASPreferencesWindowController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<int key="IBDocument.localizationMode">0</int>
|
||||
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
|
||||
<bool key="IBDocument.previouslyAttemptedUpgradeToXcode5">NO</bool>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
|
||||
<integer value="3000" key="NS.object.0"/>
|
||||
<integer value="4600" key="NS.object.0"/>
|
||||
</object>
|
||||
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
//
|
||||
// NSColor+RBLCGColorAdditions.h
|
||||
// Rebel
|
||||
//
|
||||
// Created by Justin Spahr-Summers on 01.12.11.
|
||||
// Copyright (c) 2012 GitHub. All rights reserved.
|
||||
//
|
||||
// Portions copyright (c) 2011 Bitswift. All rights reserved.
|
||||
// See the LICENSE file for more information.
|
||||
//
|
||||
|
||||
#import <AppKit/AppKit.h>
|
||||
|
||||
// Extensions to NSColor for interoperability with CGColor.
|
||||
@interface NSColor (RBLCGColorAdditions)
|
||||
|
||||
// The CGColor corresponding to the receiver.
|
||||
@property (nonatomic, readonly) CGColorRef rbl_CGColor;
|
||||
|
||||
// Returns an NSColor corresponding to the given CGColor.
|
||||
//
|
||||
// This currently does not handle pattern colors.
|
||||
+ (NSColor *)rbl_colorWithCGColor:(CGColorRef)color;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,92 @@
|
||||
//
|
||||
// NSColor+RBLCGColorAdditions.m
|
||||
// Rebel
|
||||
//
|
||||
// Created by Justin Spahr-Summers on 01.12.11.
|
||||
// Copyright (c) 2012 GitHub. All rights reserved.
|
||||
//
|
||||
// Portions copyright (c) 2011 Bitswift. All rights reserved.
|
||||
// See the LICENSE file for more information.
|
||||
//
|
||||
|
||||
#import "NSColor+RBLCGColorAdditions.h"
|
||||
|
||||
static void drawCGImagePattern (void *info, CGContextRef context) {
|
||||
CGImageRef image = info;
|
||||
|
||||
size_t width = CGImageGetWidth(image);
|
||||
size_t height = CGImageGetHeight(image);
|
||||
|
||||
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
|
||||
}
|
||||
|
||||
static void releasePatternInfo (void *info) {
|
||||
CFRelease(info);
|
||||
}
|
||||
|
||||
@implementation NSColor (RBLCGColorAdditions)
|
||||
|
||||
+ (NSColor *)rbl_colorWithCGColor:(CGColorRef)color {
|
||||
if (color == nil) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
CGColorSpaceRef colorSpaceRef = CGColorGetColorSpace(color);
|
||||
|
||||
NSColorSpace *colorSpace = [[NSColorSpace alloc] initWithCGColorSpace:colorSpaceRef];
|
||||
NSColor *result = [self colorWithColorSpace:colorSpace components:CGColorGetComponents(color) count:(size_t)CGColorGetNumberOfComponents(color)];
|
||||
[colorSpace release];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
- (CGColorRef)rbl_CGColor {
|
||||
if ([self.colorSpaceName isEqualToString:NSPatternColorSpace]) {
|
||||
CGImageRef patternImage = [self.patternImage CGImageForProposedRect:NULL context:nil hints:nil];
|
||||
if (patternImage == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size_t width = CGImageGetWidth(patternImage);
|
||||
size_t height = CGImageGetHeight(patternImage);
|
||||
|
||||
CGRect patternBounds = CGRectMake(0, 0, width, height);
|
||||
CGPatternRef pattern = CGPatternCreate(
|
||||
// Released in releasePatternInfo().
|
||||
(void *)CFRetain(patternImage),
|
||||
patternBounds,
|
||||
CGAffineTransformIdentity,
|
||||
width,
|
||||
height,
|
||||
kCGPatternTilingConstantSpacingMinimalDistortion,
|
||||
YES,
|
||||
&(CGPatternCallbacks){
|
||||
.version = 0,
|
||||
.drawPattern = &drawCGImagePattern,
|
||||
.releaseInfo = &releasePatternInfo
|
||||
}
|
||||
);
|
||||
|
||||
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreatePattern(NULL);
|
||||
|
||||
CGColorRef result = CGColorCreateWithPattern(colorSpaceRef, pattern, (CGFloat[]){ 1.0 });
|
||||
|
||||
CGColorSpaceRelease(colorSpaceRef);
|
||||
CGPatternRelease(pattern);
|
||||
|
||||
return (CGColorRef)[(id)result autorelease];
|
||||
}
|
||||
|
||||
NSColorSpace *colorSpace = NSColorSpace.genericRGBColorSpace;
|
||||
NSColor *color = [self colorUsingColorSpace:colorSpace];
|
||||
|
||||
CGFloat components[color.numberOfComponents];
|
||||
[color getComponents:components];
|
||||
|
||||
CGColorSpaceRef colorSpaceRef = colorSpace.CGColorSpace;
|
||||
CGColorRef result = CGColorCreate(colorSpaceRef, components);
|
||||
|
||||
return (CGColorRef)[(id)result autorelease];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -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 (atomic, 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
|
||||
@@ -14,10 +14,11 @@
|
||||
- (NSUInteger)indexForInsertingObject:(id)anObject sortedUsingfunction:(NSInteger (*)(id, id, void *))compare context:(void *)context; {
|
||||
NSUInteger index = 0;
|
||||
NSUInteger topIndex = [self count];
|
||||
IMP objectAtIndexImp = [self methodForSelector:@selector(objectAtIndex:)];
|
||||
// IMP objectAtIndexImp = [self methodForSelector:@selector(objectAtIndex:)];
|
||||
while (index < topIndex) {
|
||||
NSUInteger midIndex = (index + topIndex) / 2;
|
||||
id testObject = objectAtIndexImp(self, @selector(objectAtIndex:), midIndex);
|
||||
id testObject = [self objectAtIndex:midIndex];
|
||||
// id testObject = objectAtIndexImp(self, @selector(objectAtIndex:), midIndex);
|
||||
if (compare(anObject, testObject, context) > 0) {
|
||||
index = midIndex + 1;
|
||||
} else {
|
||||
@@ -28,7 +29,8 @@
|
||||
}
|
||||
|
||||
static NSComparisonResult cw_SelectorCompare(id a, id b, void* aSelector) {
|
||||
return (NSComparisonResult)objc_msgSend(a, (SEL)aSelector, b);
|
||||
return (NSComparisonResult)[a performSelector:aSelector withObject:b];
|
||||
// return (NSComparisonResult)objc_msgSend(a, (SEL)aSelector, b);
|
||||
}
|
||||
|
||||
static NSComparisonResult az_comparatorCompare(id a, id b, NSComparator comparator) {
|
||||
@@ -54,7 +56,8 @@ static IMP cw_ascendingImp = NULL;
|
||||
static NSComparisonResult cw_DescriptorCompare(id a, id b, void* descriptors) {
|
||||
NSComparisonResult result = NSOrderedSame;
|
||||
for (NSSortDescriptor* sortDescriptor in (NSArray *)descriptors) {
|
||||
result = (NSComparisonResult)cw_compareObjectToObjectImp(sortDescriptor, @selector(compareObject:toObject:), a, b);
|
||||
result = [sortDescriptor compareObject:a toObject:b];
|
||||
// result = (NSComparisonResult)cw_compareObjectToObjectImp(sortDescriptor, @selector(compareObject:toObject:), a, b);
|
||||
if (result != NSOrderedSame) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
//
|
||||
|
||||
#import "MCEditCapeController.h"
|
||||
#import "MCLibraryController.h"
|
||||
|
||||
@interface MCEditCapeController ()
|
||||
|
||||
@@ -22,10 +23,16 @@
|
||||
}
|
||||
|
||||
- (BOOL)validateValue:(inout __autoreleasing id *)ioValue forKeyPath:(NSString *)inKeyPath error:(out NSError *__autoreleasing *)outError {
|
||||
if ([inKeyPath isEqualToString:@"cursorLibrary.identifier"]) {
|
||||
BOOL valid = [self.cursorLibrary.library capesWithIdentifier:*ioValue].count == 0;
|
||||
if (!valid) {
|
||||
*outError = [NSError errorWithDomain:MCErrorDomain code:MCErrorMultipleCursorIdentifiersCode userInfo:@{ NSLocalizedDescriptionKey: NSLocalizedString(@"A cape with this identifier already exists", "Duplicate cape identifier error") }];
|
||||
}
|
||||
return valid;
|
||||
}
|
||||
|
||||
#warning TODO: check if library has this identifier
|
||||
NSLog(@"validate %@", inKeyPath);
|
||||
return YES;
|
||||
}
|
||||
|
||||
|
||||
@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];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,17 @@
|
||||
return NO;
|
||||
}
|
||||
|
||||
NSBeginAlertSheet(@"Do you want to save your changes?", @"Save", @"Cancel", @"Discard Changes", self.window, self, NULL, @selector(sheetDidDismiss:returnCode:contextInfo:), (__bridge void *)nextLibrary, @"Your changes will be discarded if you don't save them.");
|
||||
NSBeginAlertSheet(
|
||||
NSLocalizedString(@"Do you want to save your changes?", "Save Prompt Title"),
|
||||
NSLocalizedString(@"Save", "Save Prompt Button"),
|
||||
NSLocalizedString(@"Cancel", "Save Prompt Button"),
|
||||
NSLocalizedString(@"Discard Changes", "Save Prompt Button"),
|
||||
self.window,
|
||||
self,
|
||||
NULL,
|
||||
@selector(sheetDidDismiss:returnCode:contextInfo:),
|
||||
(__bridge void *)nextLibrary,
|
||||
NSLocalizedString(@"Your changes will be discarded if you don't save them.", "Save prompt threat"));
|
||||
return YES;
|
||||
}
|
||||
|
||||
@@ -56,7 +66,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 {
|
||||
@@ -129,8 +139,8 @@
|
||||
|
||||
- (NSError *)willPresentError:(NSError *)error {
|
||||
return [NSError errorWithDomain:error.domain code:error.code userInfo:@{
|
||||
NSLocalizedDescriptionKey: error.localizedDescription,
|
||||
NSLocalizedRecoverySuggestionErrorKey: error.localizedFailureReason
|
||||
NSLocalizedDescriptionKey: error.localizedDescription ?: @"",
|
||||
NSLocalizedRecoverySuggestionErrorKey: error.localizedFailureReason ?: @""
|
||||
}];
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,9 @@
|
||||
|
||||
- (NSURL *)URLForCape:(MCCursorLibrary *)cape;
|
||||
|
||||
- (NSSet *)capesWithIdentifier:(NSString *)identifier;
|
||||
- (BOOL)dumpCursorsWithProgressBlock:(BOOL (^)(NSUInteger current, NSUInteger total))block;
|
||||
|
||||
@end
|
||||
|
||||
@interface MCLibraryController (Capes)
|
||||
|
||||
@@ -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:0 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;
|
||||
|
||||
@@ -146,17 +147,38 @@ const char MCLibraryIdentifierContext;
|
||||
self.appliedCape = nil;
|
||||
}
|
||||
|
||||
- (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]];
|
||||
|
||||
#warning TODO: Do something with the error
|
||||
[[NSFileManager defaultManager] moveItemAtURL:oldURL toURL:cape.fileURL error:nil];
|
||||
// [cape save];
|
||||
- (NSSet *)capesWithIdentifier:(NSString *)identifier {
|
||||
NSPredicate *pred = [NSPredicate predicateWithFormat:@"identifier == %@", identifier];
|
||||
return [self.capes filteredSetUsingPredicate:pred];
|
||||
}
|
||||
|
||||
- (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: @"%@ (%f).cape",
|
||||
NSLocalizedString(@"Mousecape Dump", @"Mousecape dump cursor file name"),
|
||||
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 %@ %lu", (unsigned long)current, NSLocalizedString(@"of", @"Dump cursor progress separator (eg: 5 of 129)"), (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
|
||||
@@ -133,7 +161,9 @@
|
||||
}
|
||||
|
||||
- (id)transformedValue:(id)value {
|
||||
return [NSLocalizedString(@"Applied Cape: ", @"Accessory label for applied cape") stringByAppendingString:value ? value : NSLocalizedString(@"None", @"Accessory label for when no cape is applied")];
|
||||
return [
|
||||
NSLocalizedString(@"Applied Cape: ", @"Accessory label for applied cape")
|
||||
stringByAppendingString:value ? value : NSLocalizedString(@"None", @"Window Titlebar Accessory label for when no cape is applied")];
|
||||
}
|
||||
|
||||
@end
|
||||
@end
|
||||
|
||||
@@ -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="6205" systemVersion="13E28" 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="6205"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="MCGeneralPreferencesController">
|
||||
@@ -11,41 +11,65 @@
|
||||
</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>
|
||||
<slider verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="JRx-YT-ae7">
|
||||
<rect key="frame" x="18" y="19" width="392" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<sliderCell key="cell" continuous="YES" state="on" alignment="left" minValue="1" maxValue="16" doubleValue="1" tickMarkPosition="below" numberOfTickMarks="16" sliderType="linear" id="osm-63-Q66"/>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ndv-TL-Pur">
|
||||
<rect key="frame" x="18" y="106" width="48" height="17"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="I am... " 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" translatesAutoresizingMaskIntoConstraints="NO" id="8pe-9P-fa1">
|
||||
<rect key="frame" x="68" y="102" 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" translatesAutoresizingMaskIntoConstraints="NO" id="JRx-YT-ae7">
|
||||
<rect key="frame" x="18" y="15" width="392" height="25"/>
|
||||
<sliderCell key="cell" continuous="YES" state="on" alignment="left" minValue="0.5" 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"/>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hg4-8F-fVE">
|
||||
<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"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</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"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Double Clicks capes" id="mFs-6l-Guo">
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="yjb-oM-v3t">
|
||||
<rect key="frame" x="18" y="77" width="90" height="17"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Double Clicks" id="mFs-6l-Guo">
|
||||
<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="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">
|
||||
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ZYi-xB-wBd">
|
||||
<rect key="frame" x="114" y="72" 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,23 @@
|
||||
<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"/>
|
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="QBy-dj-wZ4">
|
||||
<rect key="frame" x="416" y="21" width="44" height="19"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="44" id="6CD-yu-I0l"/>
|
||||
</constraints>
|
||||
<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"/>
|
||||
@@ -83,8 +105,47 @@
|
||||
<binding destination="-2" name="value" keyPath="cursorScale" id="ffZ-zU-mYh"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="BrD-CT-ISu">
|
||||
<rect key="frame" x="168" y="106" width="51" height="17"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="handed" id="L0R-Jd-0pF">
|
||||
<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="Mx2-2f-xxz">
|
||||
<rect key="frame" x="231" y="77" width="40" height="17"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="capes" id="PAA-Qd-rHg">
|
||||
<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="ZYi-xB-wBd" firstAttribute="leading" secondItem="yjb-oM-v3t" secondAttribute="trailing" constant="8" id="75E-3R-Wci"/>
|
||||
<constraint firstItem="yjb-oM-v3t" firstAttribute="top" secondItem="Ndv-TL-Pur" secondAttribute="bottom" constant="12" id="8sY-OX-BJr"/>
|
||||
<constraint firstAttribute="trailing" secondItem="QBy-dj-wZ4" secondAttribute="trailing" constant="20" id="AzN-Bd-09M"/>
|
||||
<constraint firstItem="yjb-oM-v3t" firstAttribute="leading" secondItem="Ndv-TL-Pur" secondAttribute="leading" id="BbZ-Ge-lTF"/>
|
||||
<constraint firstItem="hg4-8F-fVE" firstAttribute="leading" secondItem="JRx-YT-ae7" secondAttribute="leading" constant="2" id="Fc0-NM-Trw"/>
|
||||
<constraint firstItem="BrD-CT-ISu" firstAttribute="centerY" secondItem="8pe-9P-fa1" secondAttribute="centerY" id="Hg2-I1-obt"/>
|
||||
<constraint firstItem="QBy-dj-wZ4" firstAttribute="leading" secondItem="JRx-YT-ae7" secondAttribute="trailing" constant="8" id="JVR-o1-2YY"/>
|
||||
<constraint firstItem="Mx2-2f-xxz" firstAttribute="centerY" secondItem="ZYi-xB-wBd" secondAttribute="centerY" constant="-0.5" id="M1O-2Z-BQG"/>
|
||||
<constraint firstItem="ZYi-xB-wBd" firstAttribute="top" secondItem="8pe-9P-fa1" secondAttribute="bottom" constant="8" symbolic="YES" id="MxX-Qk-iHu"/>
|
||||
<constraint firstItem="Mx2-2f-xxz" firstAttribute="leading" secondItem="ZYi-xB-wBd" secondAttribute="trailing" constant="8" id="Ocg-tR-hZA"/>
|
||||
<constraint firstItem="hg4-8F-fVE" firstAttribute="top" secondItem="yjb-oM-v3t" secondAttribute="bottom" constant="12" id="P7d-eI-p1C"/>
|
||||
<constraint firstItem="BrD-CT-ISu" firstAttribute="leading" secondItem="8pe-9P-fa1" secondAttribute="trailing" constant="8" id="Rb5-Nu-xUh"/>
|
||||
<constraint firstItem="8pe-9P-fa1" firstAttribute="leading" secondItem="Ndv-TL-Pur" secondAttribute="trailing" constant="4" id="UkQ-8L-CRg"/>
|
||||
<constraint firstItem="Ndv-TL-Pur" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" id="Z9v-C6-xzG"/>
|
||||
<constraint firstItem="Ndv-TL-Pur" firstAttribute="top" secondItem="1" secondAttribute="top" constant="20" id="c2R-ME-mbU"/>
|
||||
<constraint firstItem="yjb-oM-v3t" firstAttribute="centerY" secondItem="ZYi-xB-wBd" secondAttribute="centerY" constant="-0.5" id="eQr-KJ-ljI"/>
|
||||
<constraint firstAttribute="bottom" secondItem="JRx-YT-ae7" secondAttribute="bottom" constant="16" id="eeD-OM-YJ7"/>
|
||||
<constraint firstItem="Ndv-TL-Pur" firstAttribute="centerY" secondItem="8pe-9P-fa1" secondAttribute="centerY" id="gJN-ub-C95"/>
|
||||
<constraint firstItem="yjb-oM-v3t" firstAttribute="leading" secondItem="hg4-8F-fVE" secondAttribute="leading" constant="-2" id="jMe-as-UYa"/>
|
||||
<constraint firstItem="QBy-dj-wZ4" firstAttribute="centerY" secondItem="JRx-YT-ae7" secondAttribute="centerY" constant="-3.5" id="mBD-l8-aHL"/>
|
||||
</constraints>
|
||||
<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;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
#import "MCCursor.h"
|
||||
|
||||
#import "NSBitmapImageRep+ColorSpace.h"
|
||||
MCCursorScale cursorScaleForScale(CGFloat scale) {
|
||||
if (scale < 0.0)
|
||||
return MCCursorScaleNone;
|
||||
@@ -16,7 +16,8 @@ MCCursorScale cursorScaleForScale(CGFloat scale) {
|
||||
}
|
||||
|
||||
@interface MCCursor ()
|
||||
@property (readwrite, strong) NSMutableDictionary *representations;
|
||||
@property (readwrite, strong) NSMutableDictionary<NSString *, NSBitmapImageRep *> *representations;
|
||||
- (NSInteger)framesForScale:(MCCursorScale)scale;
|
||||
- (BOOL)_readFromDictionary:(NSDictionary *)dictionary ofVersion:(CGFloat)version;
|
||||
@end
|
||||
|
||||
@@ -97,16 +98,18 @@ MCCursorScale cursorScaleForScale(CGFloat scale) {
|
||||
self.frameCount = frameCount.unsignedIntegerValue;
|
||||
self.frameDuration = frameDuration.doubleValue;
|
||||
self.hotSpot = NSMakePoint(hotSpotX.doubleValue, hotSpotY.doubleValue);
|
||||
self.size = NSMakeSize(pointsWide.doubleValue, pointsHigh.doubleValue);
|
||||
// self.repeatCount = repeatCount.unsignedIntegerValue;
|
||||
|
||||
for (NSData *data in reps) {
|
||||
// data in v2.0 documents are saved as PNGs
|
||||
NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithData:data];
|
||||
rep.size = NSMakeSize(self.size.width, self.size.height * self.frameCount);
|
||||
[self setRepresentation:rep forScale:cursorScaleForScale(rep.pixelsWide / self.size.width)];
|
||||
|
||||
[self setRepresentation:rep.retaggedSRGBSpace forScale:cursorScaleForScale(rep.pixelsWide / pointsWide.doubleValue)];
|
||||
}
|
||||
|
||||
self.size = NSMakeSize(pointsWide.doubleValue, pointsHigh.doubleValue);
|
||||
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
@@ -126,7 +129,7 @@ MCCursorScale cursorScaleForScale(CGFloat scale) {
|
||||
NSMutableArray *pngs = [NSMutableArray array];
|
||||
for (NSString *key in self.representations) {
|
||||
NSBitmapImageRep *rep = self.representations[key];
|
||||
pngs[pngs.count] = [rep representationUsingType:NSPNGFileType properties:nil];
|
||||
pngs[pngs.count] = [rep.ensuredSRGBSpace TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:1.0];
|
||||
}
|
||||
|
||||
drep[MCCursorDictionaryRepresentationsKey] = pngs;
|
||||
@@ -176,25 +179,97 @@ MCCursorScale cursorScaleForScale(CGFloat scale) {
|
||||
[super setValue:value forUndefinedKey:key];
|
||||
}
|
||||
|
||||
- (void)setRepresentation:(NSImageRep *)imageRep forScale:(MCCursorScale)scale {
|
||||
- (void)setRepresentation:(NSBitmapImageRep *)imageRep forScale:(MCCursorScale)scale {
|
||||
[self willChangeValueForKey:@"representations"];
|
||||
|
||||
NSString *key = [@"cursorRep" stringByAppendingFormat:@"%lu", scale];
|
||||
[self willChangeValueForKey:key];
|
||||
if (imageRep)
|
||||
[self.representations setObject:imageRep forKey:@(scale)];
|
||||
[self.representations setObject:imageRep forKey:[NSString stringWithFormat:@"%lu", (unsigned long)scale, nil]];
|
||||
else
|
||||
[self.representations removeObjectForKey:@(scale)];
|
||||
[self.representations removeObjectForKey:[NSString stringWithFormat:@"%lu", (unsigned long)scale, nil]];
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
+ (NSBitmapImageRep *)composeRepresentationWithFrames:(NSArray<NSBitmapImageRep *> *)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:NSCalibratedRGBColorSpace
|
||||
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--) {
|
||||
NSBitmapImageRep *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:NSCompositingOperationSourceOver
|
||||
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 {
|
||||
return self.representations[@(scale)];
|
||||
return self.representations[[NSString stringWithFormat:@"%lu", (unsigned long)scale, nil]];
|
||||
}
|
||||
|
||||
- (NSImageRep *)representationWithScale:(CGFloat)scale {
|
||||
@@ -203,7 +278,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;
|
||||
@@ -23,19 +28,35 @@
|
||||
- (void)startObservingCursor:(MCCursor *)cursor;
|
||||
- (void)stopObservingCursor:(MCCursor *)cursor;
|
||||
|
||||
+ (NSArray *)cursorUndoProperties;
|
||||
+ (NSArray *)undoProperties;
|
||||
+ (NSDictionary<NSString *, NSString *> *)cursorUndoProperties;
|
||||
+ (NSDictionary<NSString *, NSString *> *)undoProperties;
|
||||
@end
|
||||
|
||||
@implementation MCCursorLibrary
|
||||
@dynamic isDirty;
|
||||
@dynamic dirty;
|
||||
|
||||
+ (NSArray *)undoProperties {
|
||||
return @[ @"identifier", @"name", @"author", @"hiDPI", @"version", @"inCloud" ];
|
||||
+ (NSDictionary<NSString *, NSString *> *)undoProperties {
|
||||
return @{
|
||||
@"identifier": NSLocalizedString(@"identifier", @"Undo change cape identifier suffix"),
|
||||
@"name": NSLocalizedString(@"name", @"Undo change cape name suffix"),
|
||||
@"author": NSLocalizedString(@"author", @"Undo change cape author suffix"),
|
||||
@"hiDPI": NSLocalizedString(@"hiDPI", @"Undo change cape hidpi suffix"),
|
||||
@"version": NSLocalizedString(@"version", @"Undo change cape version suffix")
|
||||
};
|
||||
}
|
||||
|
||||
+ (NSArray *)cursorUndoProperties {
|
||||
return @[ @"identifier", @"frameDuration", @"frameCount", @"size", @"hotSpot", @"cursorRep100", @"cursorRep200", @"cursorRep500", @"cursorRep1000" ];
|
||||
+ (NSDictionary<NSString *, NSString *> *)cursorUndoProperties {
|
||||
return @{
|
||||
@"identifier" : NSLocalizedString(@"cursor type", @"Undo change cursor type suffix"),
|
||||
@"frameDuration": NSLocalizedString(@"frame duration", @"Undo change cursor frame duraiton suffix"),
|
||||
@"frameCount" : NSLocalizedString(@"frame count", @"Undo change cursor frame count suffix"),
|
||||
@"size" : NSLocalizedString(@"dimensions", @"Undo change cursor image dimensions suffix"),
|
||||
@"hotSpot" : NSLocalizedString(@"hotspot", @"Undo change cursor hotspot suffix"),
|
||||
@"cursorRep100" : NSLocalizedString(@"1x Representation", @"Undo change cursor 1x rep suffix"),
|
||||
@"cursorRep200" : NSLocalizedString(@"2x Rep", "Undo change cursor 2x rep suffix"),
|
||||
@"cursorRep500" : NSLocalizedString(@"2x Rep", "Undo change cursor 5x rep suffix"),
|
||||
@"cursorRep1000": NSLocalizedString(@"2x Rep", "Undo change cursor 10x rep suffix")
|
||||
};
|
||||
}
|
||||
|
||||
+ (MCCursorLibrary *)cursorLibraryWithContentsOfFile:(NSString *)path {
|
||||
@@ -88,26 +109,28 @@
|
||||
|
||||
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.name = @"Unnamed";
|
||||
self.author = NSUserName();
|
||||
self.hiDPI = NO;
|
||||
self.inCloud = NO;
|
||||
self.identifier = [NSString stringWithFormat:@"local.%@.Unnamed.%f", self.author, [NSDate timeIntervalSinceReferenceDate]];
|
||||
self.version = @1.0;
|
||||
self.cursors = [NSMutableSet set];
|
||||
self.changeCount = 0;
|
||||
self.observers = @[ob1, ob2, ob3];
|
||||
|
||||
self.name = NSLocalizedString(@"Unnamed", "Default New Cape Name");
|
||||
self.author = NSUserName();
|
||||
self.hiDPI = NO;
|
||||
self.inCloud = NO;
|
||||
self.identifier = [NSString stringWithFormat:@"local.%@.Unnamed.%f", self.author, [NSDate timeIntervalSinceReferenceDate]];
|
||||
self.version = @1.0;
|
||||
self.cursors = [NSMutableSet set];
|
||||
self.changeCount = 0;
|
||||
self.lastChangeCount = 0;
|
||||
[self startObservingProperties];
|
||||
}
|
||||
@@ -132,7 +155,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 +216,10 @@
|
||||
for (MCCursor *cursor in self.cursors) {
|
||||
[self stopObservingCursor:cursor];
|
||||
}
|
||||
|
||||
for (id observer in self.observers) {
|
||||
[NSNotificationCenter.defaultCenter removeObserver:observer];
|
||||
}
|
||||
}
|
||||
|
||||
const char MCCursorLibraryPropertiesContext;
|
||||
@@ -223,10 +250,12 @@ const char MCCursorPropertiesContext;
|
||||
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
|
||||
if (context == &MCCursorLibraryPropertiesContext || context == &MCCursorPropertiesContext) {
|
||||
NSString *decamelized = [keyPath stringByReplacingOccurrencesOfString:@"([a-z])([A-Z])"
|
||||
withString:@"$1 $2"
|
||||
options:NSRegularExpressionSearch
|
||||
range:NSMakeRange(0, keyPath.length)];
|
||||
NSString *decamelized = NULL;
|
||||
if (context == &MCCursorLibraryPropertiesContext) {
|
||||
decamelized = [self.class undoProperties][keyPath];
|
||||
} else {
|
||||
decamelized = [self.class cursorUndoProperties][keyPath];
|
||||
}
|
||||
|
||||
id oldValue = change[NSKeyValueChangeOldKey];
|
||||
if ([oldValue isKindOfClass:[NSNull class]])
|
||||
@@ -235,7 +264,11 @@ const char MCCursorPropertiesContext;
|
||||
[[self.undoManager prepareWithInvocationTarget: object] setValue:oldValue forKeyPath:keyPath];
|
||||
|
||||
if (!self.undoManager.isUndoing) {
|
||||
[self.undoManager setActionName:[[@"Change " stringByAppendingString:decamelized] capitalizedString]];
|
||||
[self.undoManager setActionName:[[NSLocalizedString(@"Change ", "Undo Change Prefix") stringByAppendingString:decamelized] capitalizedString]];
|
||||
}
|
||||
|
||||
if ([keyPath isEqualToString:@"identifier"]) {
|
||||
self.oldIdentifier = oldValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -268,7 +301,7 @@ const char MCCursorPropertiesContext;
|
||||
|
||||
[[self.undoManager prepareWithInvocationTarget:self] removeCursor:cursor];
|
||||
if (!self.undoManager.isUndoing) {
|
||||
[self.undoManager setActionName:@"Add Cursor"];
|
||||
[self.undoManager setActionName:NSLocalizedString(@"Add Cursor", "Add Cursor Undo Title")];
|
||||
}
|
||||
|
||||
[self willChangeValueForKey:@"cursors" withSetMutation:NSKeyValueUnionSetMutation usingObjects:change];
|
||||
@@ -282,7 +315,7 @@ const char MCCursorPropertiesContext;
|
||||
|
||||
[[self.undoManager prepareWithInvocationTarget:self] addCursor:cursor];
|
||||
if (!self.undoManager.isUndoing) {
|
||||
[self.undoManager setActionName:@"Remove Cursor"];
|
||||
[self.undoManager setActionName:NSLocalizedString(@"Remove Cursor", @"Remove Cursor Undo Title")];
|
||||
}
|
||||
|
||||
[self willChangeValueForKey:@"cursors" withSetMutation:NSKeyValueMinusSetMutation usingObjects:change];
|
||||
@@ -338,19 +371,21 @@ const char MCCursorPropertiesContext;
|
||||
|
||||
if (duplicates.count > 0) {
|
||||
return [NSError errorWithDomain:MCErrorDomain code:MCErrorMultipleCursorIdentifiersCode userInfo:@{
|
||||
NSLocalizedDescriptionKey: NSLocalizedString(@"Save failed", nil),
|
||||
NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedString(@"Multiple cursors with the name(s): %@ exist.", nil), duplicates] }];
|
||||
NSLocalizedDescriptionKey: NSLocalizedString(@"Save failed", @"New Cape Failure Title"),
|
||||
NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedString(@"Multiple cursors with the name(s): %@ exist.", @"New Cape Failure Duplicate cursor name error"), 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:@{
|
||||
NSLocalizedDescriptionKey: NSLocalizedString(@"Save failed", nil),
|
||||
NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Error writing cape to disk.", nil) }];
|
||||
NSLocalizedDescriptionKey: NSLocalizedString(@"Save failed", @"New Cape Failure Title"),
|
||||
NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Error writing cape to disk.", @"New Cape Filure Filesystem Error") }];
|
||||
}
|
||||
|
||||
- (void)updateChangeCount:(NSDocumentChangeType)change {
|
||||
|
||||
@@ -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,15 +9,19 @@
|
||||
#import "MMAnimatingImageView.h"
|
||||
#import "MCSpriteLayer.h"
|
||||
|
||||
#define SHOULDCOPY NSEvent.modifierFlags & NSEventModifierFlagOption
|
||||
|
||||
const char MCInvalidateContext;
|
||||
|
||||
@interface MMAnimatingImageView ()
|
||||
@interface MMAnimatingImageView () <CALayerDelegate>
|
||||
@property (weak) MCSpriteLayer *spriteLayer;
|
||||
@property (weak) CALayer *hotSpotLayer;
|
||||
- (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,27 +95,30 @@ 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
|
||||
- (void)registerTypes {
|
||||
[self registerForDraggedTypes:[NSArray arrayWithObjects:NSPasteboardTypeTIFF, NSPasteboardTypePNG, NSFilenamesPboardType, nil]];
|
||||
[self registerForDraggedTypes:[NSArray arrayWithObjects:NSPasteboardTypeTIFF, NSFilenamesPboardType, nil]];
|
||||
}
|
||||
|
||||
- (void)viewDidMoveToWindow {
|
||||
@@ -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,20 @@ 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).tiff", NSDate.date.timeIntervalSince1970]];
|
||||
NSImageRep *rep =self.image.representations.firstObject;
|
||||
|
||||
if ([rep isKindOfClass:[NSBitmapImageRep class]]) {
|
||||
NSBitmapImageRep* bitmap = (NSBitmapImageRep*)rep;
|
||||
[[bitmap TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:1.0] writeToFile:url.path atomically:NO];
|
||||
} else {
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#pragma mark - NSDragDestination
|
||||
@@ -246,15 +302,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 +320,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
|
||||
@@ -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);
|
||||
|
||||
@@ -60,7 +60,7 @@ extern const NSString *MCCursorDictionaryPointsWideKey;
|
||||
extern const NSString *MCCursorDictionaryPointsHighKey;
|
||||
extern const NSString *MCCursorDictionaryRepresentationsKey;
|
||||
|
||||
extern NSDictionary *cursorMap();
|
||||
extern NSDictionary *cursorMap(void);
|
||||
extern NSString *nameForCursorIdentifier(NSString *identifier);
|
||||
extern NSString *cursorIdentifierForName(NSString *name);
|
||||
|
||||
@@ -68,5 +68,8 @@ extern NSString *UUID(void);
|
||||
extern NSDictionary *capeWithIdentifier(NSString *identifier);
|
||||
extern void CGImageWriteToFile(CGImageRef image, CFStringRef path);
|
||||
extern NSData *pngDataForImage(id image);
|
||||
extern NSString *MMGet();
|
||||
extern NSString *MMGet(NSString *prompt);
|
||||
|
||||
extern CGError MCIsCursorRegistered(CGSConnectionID cid, char *cursorName, bool *registered);
|
||||
extern BOOL MCCursorIsPointer(NSString *identifier);
|
||||
#endif
|
||||
|
||||
@@ -85,7 +85,7 @@ void CGImageWriteToFile(CGImageRef image, CFStringRef path) {
|
||||
|
||||
NSData *pngDataForImage(id image) {
|
||||
if ([image isKindOfClass:[NSBitmapImageRep class]]) {
|
||||
return [(NSBitmapImageRep *)image representationUsingType:NSPNGFileType properties:nil];
|
||||
return [(NSBitmapImageRep *)image TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:1.0];
|
||||
}
|
||||
|
||||
// CGImage
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
//
|
||||
// NSBitmapImageRep+ColorSpace.h
|
||||
// mousecloak
|
||||
//
|
||||
// Created by Alexander Zielenski on 12/30/18.
|
||||
// Copyright © 2018 Alex Zielenski. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface NSBitmapImageRep (ColorSpace)
|
||||
|
||||
- (NSBitmapImageRep *)retaggedSRGBSpace;
|
||||
- (NSBitmapImageRep *)ensuredSRGBSpace;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@@ -0,0 +1,36 @@
|
||||
//
|
||||
// NSBitmapImageRep+ColorSpace.m
|
||||
// mousecloak
|
||||
//
|
||||
// Created by Alexander Zielenski on 12/30/18.
|
||||
// Copyright © 2018 Alex Zielenski. All rights reserved.
|
||||
//
|
||||
|
||||
#import "NSBitmapImageRep+ColorSpace.h"
|
||||
|
||||
@implementation NSBitmapImageRep (ColorSpace)
|
||||
|
||||
// Must be careful with this because the PNGFileType representationForType of NSBitmapImageRep
|
||||
// does not encode the colorspace :(
|
||||
- (NSBitmapImageRep *)ensuredSRGBSpace {
|
||||
NSColorSpace *targetSpace = [NSColorSpace sRGBColorSpace];
|
||||
if (self.colorSpace != NULL) {
|
||||
if (self.colorSpace.numberOfColorComponents == 1) {
|
||||
targetSpace = [NSColorSpace genericGamma22GrayColorSpace];
|
||||
}
|
||||
}
|
||||
return [self bitmapImageRepByConvertingToColorSpace:targetSpace
|
||||
renderingIntent:NSColorRenderingIntentDefault];
|
||||
}
|
||||
|
||||
- (NSBitmapImageRep *)retaggedSRGBSpace {
|
||||
NSColorSpace *targetSpace = [NSColorSpace sRGBColorSpace];
|
||||
if (self.colorSpace != NULL) {
|
||||
if (self.colorSpace.numberOfColorComponents == 1) {
|
||||
targetSpace = [NSColorSpace genericGamma22GrayColorSpace];
|
||||
}
|
||||
}
|
||||
return [self bitmapImageRepByRetaggingWithColorSpace:targetSpace];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#import "backup.h"
|
||||
#import "restore.h"
|
||||
#import "MCPrefs.h"
|
||||
#import "NSBitmapImageRep+ColorSpace.h"
|
||||
|
||||
BOOL applyCursorForIdentifier(NSUInteger frameCount, CGFloat frameDuration, CGPoint hotSpot, CGSize size, NSArray *images, NSString *ident, NSUInteger repeatCount) {
|
||||
if (frameCount > 24 || frameCount < 1) {
|
||||
@@ -35,10 +36,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 +53,60 @@ 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
|
||||
NSBitmapImageRep *rep;
|
||||
if (type == CGImageGetTypeID()) {
|
||||
images[images.count] = object;
|
||||
continue;
|
||||
rep = [[[NSBitmapImageRep alloc] initWithCGImage:(__bridge CGImageRef)object] autorelease];
|
||||
} else {
|
||||
rep = [[[NSBitmapImageRep alloc] initWithData:object] autorelease];
|
||||
}
|
||||
rep = rep.retaggedSRGBSpace;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
images[images.count] = (__bridge id)[rep CGImage];
|
||||
|
||||
} else {
|
||||
NSBitmapImageRep *newRep = [[[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
|
||||
pixelsWide:rep.pixelsWide
|
||||
pixelsHigh:rep.pixelsHigh
|
||||
bitsPerSample:8
|
||||
samplesPerPixel:4
|
||||
hasAlpha:YES
|
||||
isPlanar:NO
|
||||
colorSpaceName:NSCalibratedRGBColorSpace
|
||||
bytesPerRow:4 * rep.pixelsWide
|
||||
bitsPerPixel:32] autorelease];
|
||||
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:NSCompositingOperationSourceOver
|
||||
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 +127,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;
|
||||
|
||||