1 Commits

Author SHA1 Message Date
Alex Zielenski 9cea801650 Create gh-pages branch via GitHub 2014-08-05 12:58:39 -04:00
174 changed files with 767 additions and 62662 deletions
-69
View File
@@ -1,69 +0,0 @@
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/
-3
View File
@@ -1,3 +0,0 @@
[submodule "Mousecape/Mousecape/external/Sparkle"]
path = Mousecape/Mousecape/external/Sparkle
url = https://github.com/sparkle-project/Sparkle.git
-10
View File
@@ -1,10 +0,0 @@
Copyright (c) 2013-2014, Alex Zielenski
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Any redistribution, use, or modification is done solely for personal benefit and not for any commercial purpose or for monetary gain
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
File diff suppressed because it is too large Load Diff
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:Mousecape.xcodeproj">
</FileRef>
</Workspace>
@@ -1,41 +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>IDESourceControlProjectFavoriteDictionaryKey</key>
<false/>
<key>IDESourceControlProjectIdentifier</key>
<string>BF07C3E0-6EFD-4BF5-8AB0-F3D236F6FEEA</string>
<key>IDESourceControlProjectName</key>
<string>Mousecape</string>
<key>IDESourceControlProjectOriginsDictionary</key>
<dict>
<key>FC2A2851-1AE3-4D52-8AFC-6A9D2EF109B1</key>
<string>ssh://github.com/alexzielenski/Mousecape.git</string>
</dict>
<key>IDESourceControlProjectPath</key>
<string>Mousecape/Mousecape.xcodeproj/project.xcworkspace</string>
<key>IDESourceControlProjectRelativeInstallPathDictionary</key>
<dict>
<key>FC2A2851-1AE3-4D52-8AFC-6A9D2EF109B1</key>
<string>../../..</string>
</dict>
<key>IDESourceControlProjectURL</key>
<string>ssh://github.com/alexzielenski/Mousecape.git</string>
<key>IDESourceControlProjectVersion</key>
<integer>110</integer>
<key>IDESourceControlProjectWCCIdentifier</key>
<string>FC2A2851-1AE3-4D52-8AFC-6A9D2EF109B1</string>
<key>IDESourceControlProjectWCConfigurations</key>
<array>
<dict>
<key>IDESourceControlRepositoryExtensionIdentifierKey</key>
<string>public.vcs.git</string>
<key>IDESourceControlWCCIdentifierKey</key>
<string>FC2A2851-1AE3-4D52-8AFC-6A9D2EF109B1</string>
<key>IDESourceControlWCCName</key>
<string>Mousecape</string>
</dict>
</array>
</dict>
</plist>
BIN
View File
Binary file not shown.
-697
View File
@@ -1,697 +0,0 @@
<?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>
<point key="canvasLocation" x="715" y="459"/>
</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>
<point key="canvasLocation" x="139" y="286"/>
</menu>
</objects>
<resources>
<image name="NSAddTemplate" width="11" height="11"/>
<image name="NSRemoveTemplate" width="11" height="11"/>
</resources>
</document>
-304
View File
@@ -1,304 +0,0 @@
<?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 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"/>
<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" 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 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="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="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="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>
-431
View File
@@ -1,431 +0,0 @@
<?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>
@@ -1,68 +0,0 @@
{
"images" : [
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "Mousecape-10 (dragged).png",
"scale" : "1x"
},
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "Mousecape-9 (dragged).png",
"scale" : "2x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "Mousecape-8 (dragged).png",
"scale" : "1x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "Mousecape-7 (dragged).png",
"scale" : "2x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "Mousecape-6 (dragged).png",
"scale" : "1x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "Mousecape-5 (dragged).png",
"scale" : "2x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "Mousecape-4 (dragged).png",
"scale" : "1x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "Mousecape-3 (dragged).png",
"scale" : "2x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "Mousecape-2 (dragged).png",
"scale" : "1x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "Mousecape-1 (dragged).png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 676 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

@@ -1,6 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -1,22 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "HDTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "HDTemplate@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.
@@ -1,12 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
},
"data" : [
{
"idiom" : "universal",
"filename" : "Mousecape.icns"
}
]
}
@@ -1,22 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "SDTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "SDTemplate@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

@@ -1,22 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "applied.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "applied@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

@@ -1,22 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "dz.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "dz@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

-14
View File
@@ -1,14 +0,0 @@
//
// MCAppDelegate.h
// Mousecape
//
// Created by Alex Zielenski on 2/1/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "MCLibraryWindowController.h"
@interface MCAppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSMenuItem *toggleHelperItem;
@property (strong) MCLibraryWindowController *libraryWindowController;
@end
-160
View File
@@ -1,160 +0,0 @@
//
// MCAppDelegate.m
// Mousecape
//
// Created by Alex Zielenski on 2/1/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import "MCAppDelegate.h"
#import <Security/Security.h>
#import <ServiceManagement/ServiceManagement.h>
#import "MCCursorLibrary.h"
#import "create.h"
#import "MASPreferencesWindowController.h"
#import "MCGeneralPreferencesController.h"
@interface MCAppDelegate () {
MASPreferencesWindowController *_preferencesWindowController;
}
@property (readonly) MASPreferencesWindowController *preferencesWindowController;
- (void)configureHelperToolMenuItem;
@end
@implementation MCAppDelegate
@dynamic preferencesWindowController;
- (void)applicationWillFinishLaunching:(NSNotification *)notification {
self.libraryWindowController = [[MCLibraryWindowController alloc] initWithWindowNibName:@"Library"];
[self.libraryWindowController loadWindow];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[self configureHelperToolMenuItem];
[self.libraryWindowController 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;
}
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename {
BOOL open = [filename.pathExtension.lowercaseString isEqualToString:@"cape"];
NSURL *url = [NSURL fileURLWithPath:filename];
if (open) {
[self.libraryWindowController.libraryViewController.libraryController importCapeAtURL:url];
}
return open;
}
- (void)configureHelperToolMenuItem {
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 {
BOOL success = NO;
if (self.toggleHelperItem.tag != 0) { // Uninstall
success = SMLoginItemSetEnabled(CFSTR("com.alexzielenski.mousecloakhelper"), false);
} else {
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);
}
}
- (MASPreferencesWindowController *)preferencesWindowController {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSViewController *general = [[MCGeneralPreferencesController alloc] init];
_preferencesWindowController = [[MASPreferencesWindowController alloc] initWithViewControllers:@[ general ] title:NSLocalizedString(@"Preferences", "Preferences Window Title")];
});
return _preferencesWindowController;
}
#pragma mark - Interface Actions
- (IBAction)restoreCape:(id)sender {
[self.libraryWindowController.libraryViewController.libraryController restoreCape];
}
- (IBAction)convertCape:(id)sender {
NSOpenPanel *panel = [NSOpenPanel openPanel];
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": NSLocalizedString(@"Unknown", "MightyMouse Import Default Author"),
@"identifier": [NSString stringWithFormat:@"local.import.%@.%f", name, [NSDate timeIntervalSinceReferenceDate]]
};
NSDictionary *cape = createCapeFromMightyMouse([NSDictionary dictionaryWithContentsOfURL:panel.URL], metadata);
MCCursorLibrary *library = [MCCursorLibrary cursorLibraryWithDictionary:cape];
[self.libraryWindowController.libraryViewController.libraryController importCape:library];
}
}
- (IBAction)newDocument:(id)sender {
[self.libraryWindowController.libraryViewController.libraryController importCape:[[MCCursorLibrary alloc] init]];
}
- (IBAction)openDocument:(id)sender {
NSOpenPanel *panel = [NSOpenPanel openPanel];
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];
}
}
- (IBAction)showPreferences:(id)sender {
[self.preferencesWindowController showWindow:sender];
}
@end
-82
View File
@@ -1,82 +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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>cape</string>
</array>
<key>CFBundleTypeName</key>
<string>Mouse Cape</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSItemContentTypes</key>
<array>
<string>com.alexzielenski.mousecape.cape</string>
</array>
<key>LSTypeIsPackage</key>
<integer>0</integer>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.0.6</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1782</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2014-2019 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>
<key>UTTypeConformsTo</key>
<array>
<string>public.xml</string>
<string>com.apple.property-list</string>
</array>
<key>UTTypeDescription</key>
<string>Mouse Cape</string>
<key>UTTypeIdentifier</key>
<string>com.alexzielenski.mousecape.cape</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>com.apple.ostype</key>
<array>
<string>CAPE</string>
</array>
<key>public.filename-extension</key>
<array>
<string>cape</string>
</array>
</dict>
</dict>
</array>
</dict>
</plist>
-11
View File
@@ -1,11 +0,0 @@
//
// Prefix header
//
// The contents of this file are implicitly included at the beginning of every source file.
//
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#import "MCDefs.h"
#import "MCPrefs.h"
#endif
@@ -1,32 +0,0 @@
{\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\
}
File diff suppressed because it is too large Load Diff
@@ -1,695 +0,0 @@
<?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>
@@ -1,303 +0,0 @@
<?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>
@@ -1,431 +0,0 @@
<?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>
@@ -1,32 +0,0 @@
{\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\
}
@@ -1,2 +0,0 @@
/* Localized versions of Info.plist keys */
@@ -1,7 +0,0 @@
/*
Localizable.strings
Mousecape
Created by Alexander Zielenski on 6/13/20.
Copyright © 2020 Alex Zielenski. All rights reserved.
*/
@@ -1,4 +0,0 @@
/* Bundle name */
"CFBundleName" = "com.alexzielenski.mousecloakhelper";
/* Copyright (human-readable) */
"NSHumanReadableCopyright" = "Copyright © 2014 Alex Zielenski. All rights reserved.";
@@ -1,11 +0,0 @@
{
"developmentRegion" : "en",
"targetLocale" : "en",
"toolInfo" : {
"toolBuildNumber" : "11E503a",
"toolID" : "com.apple.dt.xcode",
"toolName" : "Xcode",
"toolVersion" : "11.4.1"
},
"version" : "1.0"
}
-32
View File
@@ -1,32 +0,0 @@
{\rtf1\ansi\ansicpg1252\cocoartf2512
\cocoatextscaling0\cocoaplatform0{\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 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\
\
\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\
}
-99
View File
@@ -1,99 +0,0 @@
/* 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";
@@ -1,2 +0,0 @@
/* Localized versions of Info.plist keys */
@@ -1,42 +0,0 @@
/* 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";
@@ -1,243 +0,0 @@
/* 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";
Binary file not shown.
-48
View File
@@ -1,48 +0,0 @@
/*
Created by Jonathan Willing on 8/28/13.
Copyright (c) 2013, ButterKit. All rights reserved.
Licensed under the MIT license <http://opensource.org/licenses/MIT>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#import <Cocoa/Cocoa.h>
// A NSClipView subclass with a buttery -scrollToRect: animation.
@interface BTRClipView : NSClipView
// Calls -scrollRectToVisible:, optionally animated.
//
// If animated, the animation will be performed with an ease-out timing function.
// Any calls to this method while an animation is still in flight will update the
// current animation and adjust the deceleration as needed.
//
// Any input to the scroll view that would cause an adjustment to the bounds (such as
// a trackpad scroll) will cancel any animations in progress.
- (BOOL)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;
// Calls -scrollRectToVisible:animated: with an optional completion block. The scrolled
// completion parameter is whether any scrolling was performed.
- (BOOL)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated completion:(void (^)(BOOL scrolled))completion;
// Any time the origin changes with an animation as discussed above, the deceleration
// rate will be used to create an ease-out animation.
//
// Values should range from (0, 1]. Smaller deceleration rates will provide
// generally fast animations, whereas larger rates will create lengthy animations.
//
// Defaults to 0.78.
@property (nonatomic, assign) CGFloat decelerationRate;
@end
-221
View File
@@ -1,221 +0,0 @@
/*
Created by Jonathan Willing on 8/28/13.
Copyright (c) 2013, ButterKit. All rights reserved.
Licensed under the MIT license <http://opensource.org/licenses/MIT>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#import "BTRClipView.h"
// The default deceleration constant used for the ease-out curve in the animation.
static const CGFloat BTRClipViewDecelerationRate = 0.78;
@interface BTRClipView ()
// Used to drive the animation through repeated callbacks.
// A display link is used instead of a timer so that we don't get dropped frames and tearing.
// Lazily created when needed, released in dealloc. Stopped automatically when scrolling is not occurring.
@property (nonatomic, assign) CVDisplayLinkRef displayLink;
// Used to determine whether to animate in `scrollToPoint:`.
@property (nonatomic, assign) BOOL shouldAnimateOriginChange;
// Used when animating with the display link as the final origin for the animation.
@property (nonatomic, assign) CGPoint destinationOrigin;
// The scroll view which has this clip view set as the content view.
@property (nonatomic, assign) NSScrollView *containingScrollView;
// The optional completion block which is called at the end of the scroll animation.
@property (nonatomic, copy) void (^scrollCompletion)(BOOL success);
@end
@implementation BTRClipView
- (instancetype)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self == nil) return nil;
self.wantsLayer = YES;
self.decelerationRate = BTRClipViewDecelerationRate;
return self;
}
- (void)dealloc {
CVDisplayLinkRelease(_displayLink);
[NSNotificationCenter.defaultCenter removeObserver:self];
}
#pragma mark View Heirarchy
- (void)viewWillMoveToWindow:(NSWindow *)newWindow {
if (self.window != nil) {
[NSNotificationCenter.defaultCenter removeObserver:self name:NSWindowDidChangeScreenNotification object:self.window];
}
[super viewWillMoveToWindow:newWindow];
if (newWindow != nil) {
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateCVDisplay:) name:NSWindowDidChangeScreenNotification object:newWindow];
}
}
#pragma mark Display link
static CVReturn BTRScrollingCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *now, const CVTimeStamp *outputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext) {
@autoreleasepool {
BTRClipView *clipView = (__bridge id)displayLinkContext;
dispatch_async(dispatch_get_main_queue(), ^{
[clipView updateOrigin];
});
}
return kCVReturnSuccess;
}
- (CVDisplayLinkRef)displayLink {
if (_displayLink == NULL) {
CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink);
CVDisplayLinkSetOutputCallback(_displayLink, &BTRScrollingCallback, (__bridge void *)self);
[self updateCVDisplay:nil];
}
return _displayLink;
}
- (void)updateCVDisplay:(NSNotification *)note {
NSScreen *screen = self.window.screen;
if (screen == nil) {
NSDictionary *screenDictionary = NSScreen.mainScreen.deviceDescription;
NSNumber *screenID = screenDictionary[@"NSScreenNumber"];
CGDirectDisplayID displayID = screenID.unsignedIntValue;
CVDisplayLinkSetCurrentCGDisplay(_displayLink, displayID);
} else {
CVDisplayLinkSetCurrentCGDisplay(_displayLink, kCGDirectMainDisplay);
}
}
#pragma mark Scrolling
- (void)scrollToPoint:(NSPoint)newOrigin {
// We should only attempt to animate ourselves if we know this point we're scrolling to
// was the point determined from a -scrollToRect:animated: call.
if (self.shouldAnimateOriginChange) {
self.shouldAnimateOriginChange = NO;
self.destinationOrigin = newOrigin;
[self beginScrolling];
} else {
// Otherwise, we stop any scrolling that is currently occurring (if needed) and let
// super's implementation handle a normal scroll.
[self endScrolling];
[super scrollToPoint:newOrigin];
}
}
- (BOOL)scrollRectToVisible:(NSRect)aRect animated:(BOOL)animated {
self.shouldAnimateOriginChange = animated;
return [super scrollRectToVisible:aRect];
}
- (BOOL)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated completion:(void (^)(BOOL sucess))completion {
self.scrollCompletion = completion;
BOOL success = [self scrollRectToVisible:rect animated:animated];
if (!animated || !success) {
[self handleCompletionIfNeededWithSuccess:success];
}
return success;
}
- (void)beginScrolling {
if (CVDisplayLinkIsRunning(self.displayLink)) {
return;
}
CVDisplayLinkStart(self.displayLink);
}
- (void)endScrolling {
if (!CVDisplayLinkIsRunning(self.displayLink)) {
return;
}
CVDisplayLinkStop(self.displayLink);
}
// Sanitize the deceleration rate to [0, 1] so nothing unexpected happens.
- (void)setDecelerationRate:(CGFloat)decelerationRate {
if (decelerationRate > 1) {
decelerationRate = 1;
}
else if (decelerationRate < 0) {
decelerationRate = 0;
}
_decelerationRate = decelerationRate;
}
- (NSScrollView *)containingScrollView {
if (_containingScrollView == nil) {
_containingScrollView = self.enclosingScrollView;
if (_containingScrollView == nil && [self.superview isKindOfClass:NSScrollView.class]) {
_containingScrollView = (NSScrollView *)self.superview;
}
}
return _containingScrollView;
}
- (void)updateOrigin {
if (self.window == nil) {
[self endScrolling];
return;
}
CGPoint o = self.bounds.origin;
CGPoint lastOrigin = o;
CGFloat deceleration = self.decelerationRate;
// Calculate the next origin on a basic ease-out curve.
o.x = o.x * deceleration + self.destinationOrigin.x * (1 - self.decelerationRate);
o.y = o.y * deceleration + self.destinationOrigin.y * (1 - self.decelerationRate);
// Calling -scrollToPoint: instead of manually adjusting the bounds lets us get the expected
// overlay scroller behavior for free.
[super scrollToPoint:o];
// Make this call so that we can force an update of the scroller positions.
[self.containingScrollView reflectScrolledClipView:self];
if ((fabs(o.x - lastOrigin.x) < 0.1 && fabs(o.y - lastOrigin.y) < 0.1)) {
[self endScrolling];
// Make sure we always finish out the animation with the actual coordinates
[super scrollToPoint:o];
[self handleCompletionIfNeededWithSuccess:YES];
}
}
#pragma mark Completion handling
- (void)handleCompletionIfNeededWithSuccess:(BOOL)success {
if (self.scrollCompletion != nil) {
self.scrollCompletion(success);
self.scrollCompletion = nil;
}
}
@end
-33
View File
@@ -1,33 +0,0 @@
/*
Created by Jonathan Willing on 8/28/13.
Copyright (c) 2013, ButterKit. All rights reserved.
Licensed under the MIT license <http://opensource.org/licenses/MIT>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#import <Cocoa/Cocoa.h>
#import "BTRClipView.h"
// A NSScrollView subclass which uses an instance of BTRClipView
// as the clip view instead of NSClipView.
//
// Layer-backed by default.
@interface BTRScrollView : NSScrollView
// Returns the scroll view's content view that is an instance of BTRClipView, or
// nil if it does not exist.
- (BTRClipView *)clipView;
@end
-62
View File
@@ -1,62 +0,0 @@
/*
Created by Jonathan Willing on 8/28/13.
Copyright (c) 2013, ButterKit. All rights reserved.
Licensed under the MIT license <http://opensource.org/licenses/MIT>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#import "BTRScrollView.h"
#import "BTRClipView.h"
@implementation BTRScrollView
#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:BTRClipView.class]) {
[self swapClipView];
}
}
- (BTRClipView *)clipView {
if ([self.contentView isKindOfClass:BTRClipView.class]) {
return (BTRClipView *)self.contentView;
}
return nil;
}
#pragma mark Clip view swapping
- (void)swapClipView {
self.wantsLayer = YES;
id documentView = self.documentView;
BTRClipView *clipView = [[BTRClipView alloc] initWithFrame:self.contentView.frame];
self.contentView = clipView;
self.documentView = documentView;
}
@end
@@ -1,16 +0,0 @@
//
// 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
@@ -1,33 +0,0 @@
//
// 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,22 +0,0 @@
//
// Any controller providing preference pane view must support this protocol
//
@protocol MASPreferencesViewController <NSObject>
@optional
- (void)viewWillAppear;
- (void)viewDidDisappear;
- (NSView *)initialKeyView;
@property (nonatomic, readonly) BOOL hasResizableWidth;
@property (nonatomic, readonly) BOOL hasResizableHeight;
@required
@property (nonatomic, readonly) NSString *identifier;
@property (nonatomic, readonly) NSImage *toolbarItemImage;
@property (nonatomic, readonly) NSString *toolbarItemLabel;
@end
@@ -1,271 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
<data>
<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">6154.17</string>
</object>
<array key="IBDocument.IntegratedClassDependencies">
<string>NSCustomObject</string>
<string>NSToolbar</string>
<string>NSView</string>
<string>NSWindowTemplate</string>
</array>
<array key="IBDocument.PluginDependencies">
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</array>
<object class="NSMutableDictionary" key="IBDocument.Metadata">
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
<integer value="1" key="NS.object.0"/>
</object>
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<object class="NSCustomObject" id="1001">
<string key="NSClassName">MASPreferencesWindowController</string>
</object>
<object class="NSCustomObject" id="1003">
<string key="NSClassName">FirstResponder</string>
</object>
<object class="NSCustomObject" id="1004">
<string key="NSClassName">NSApplication</string>
</object>
<object class="NSWindowTemplate" id="1005">
<int key="NSWindowStyleMask">11</int>
<int key="NSWindowBacking">2</int>
<string key="NSWindowRect">{{540, 400}, {360, 270}}</string>
<int key="NSWTFlags">1618478080</int>
<string key="NSWindowTitle"/>
<string key="NSWindowClass">NSPanel</string>
<object class="NSToolbar" key="NSViewClass" id="693562270">
<string key="NSToolbarIdentifier">45E11247-C0D1-4D0A-A5E9-F1307B14CEF7</string>
<nil key="NSToolbarDelegate"/>
<bool key="NSToolbarPrefersToBeShown">YES</bool>
<bool key="NSToolbarShowsBaselineSeparator">YES</bool>
<bool key="NSToolbarAllowsUserCustomization">NO</bool>
<bool key="NSToolbarAutosavesConfiguration">NO</bool>
<int key="NSToolbarDisplayMode">1</int>
<int key="NSToolbarSizeMode">1</int>
<dictionary class="NSMutableDictionary" key="NSToolbarIBIdentifiedItems"/>
<array key="NSToolbarIBAllowedItems" id="0"/>
<reference key="NSToolbarIBDefaultItems" ref="0"/>
<reference key="NSToolbarIBSelectableItems" ref="0"/>
</object>
<nil key="NSUserInterfaceItemIdentifier"/>
<object class="NSView" key="NSWindowView" id="1006">
<reference key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<string key="NSFrameSize">{360, 270}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
</object>
<string key="NSScreenRect">{{0, 0}, {2560, 1417}}</string>
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
<string key="NSFrameAutosaveName"/>
<bool key="NSWindowIsRestorable">YES</bool>
</object>
</array>
<object class="IBObjectContainer" key="IBDocument.Objects">
<array class="NSMutableArray" key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">window</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="1005"/>
</object>
<int key="connectionID">3</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">toolbar</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="693562270"/>
</object>
<int key="connectionID">23</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">delegate</string>
<reference key="source" ref="1005"/>
<reference key="destination" ref="1001"/>
</object>
<int key="connectionID">20</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">delegate</string>
<reference key="source" ref="693562270"/>
<reference key="destination" ref="1001"/>
</object>
<int key="connectionID">22</int>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<array key="orderedObjects">
<object class="IBObjectRecord">
<int key="objectID">0</int>
<reference key="object" ref="0"/>
<reference key="children" ref="1000"/>
<nil key="parent"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">-2</int>
<reference key="object" ref="1001"/>
<reference key="parent" ref="0"/>
<string key="objectName">File's Owner</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">-1</int>
<reference key="object" ref="1003"/>
<reference key="parent" ref="0"/>
<string key="objectName">First Responder</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">-3</int>
<reference key="object" ref="1004"/>
<reference key="parent" ref="0"/>
<string key="objectName">Application</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">1</int>
<reference key="object" ref="1005"/>
<array class="NSMutableArray" key="children">
<reference ref="1006"/>
<reference ref="693562270"/>
</array>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2</int>
<reference key="object" ref="1006"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">4</int>
<reference key="object" ref="693562270"/>
<reference key="parent" ref="1005"/>
</object>
</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"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">27</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<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>
<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="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="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="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>
</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="4600" key="NS.object.0"/>
</object>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
</data>
</archive>
@@ -1,44 +0,0 @@
//
// You create an application Preferences window using code like this:
// _preferencesWindowController = [[MASPreferencesWindowController alloc] initWithViewControllers:controllers
// title:title]
//
// To open the Preferences window:
// [_preferencesWindowController showWindow:sender]
//
#import "MASPreferencesViewController.h"
extern NSString *const kMASPreferencesWindowControllerDidChangeViewNotification;
__attribute__((__visibility__("default")))
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
@interface MASPreferencesWindowController : NSWindowController <NSToolbarDelegate, NSWindowDelegate>
#else
@interface MASPreferencesWindowController : NSWindowController
#endif
{
@private
NSMutableArray *_viewControllers;
NSMutableDictionary *_minimumViewRects;
NSString *_title;
NSViewController <MASPreferencesViewController> *_selectedViewController;
IBOutlet NSToolbar *toolbar;
}
@property (nonatomic, readonly) NSMutableArray *viewControllers;
@property (nonatomic, readonly) NSUInteger indexOfSelectedController;
@property (nonatomic, readonly, retain) NSViewController <MASPreferencesViewController> *selectedViewController;
@property (nonatomic, readonly) NSString *title;
@property (nonatomic, retain) IBOutlet NSToolbar *toolbar;
- (id)initWithViewControllers:(NSArray *)viewControllers;
- (id)initWithViewControllers:(NSArray *)viewControllers title:(NSString *)title;
- (void)addViewController:(NSViewController <MASPreferencesViewController> *) viewController;
- (void)selectControllerAtIndex:(NSUInteger)controllerIndex;
- (IBAction)goNextTab:(id)sender;
- (IBAction)goPreviousTab:(id)sender;
@end
@@ -1,359 +0,0 @@
#import "MASPreferencesWindowController.h"
NSString *const kMASPreferencesWindowControllerDidChangeViewNotification = @"MASPreferencesWindowControllerDidChangeViewNotification";
static NSString *const kMASPreferencesFrameTopLeftKey = @"MASPreferences Frame Top Left";
static NSString *const kMASPreferencesSelectedViewKey = @"MASPreferences Selected Identifier View";
static NSString *const PreferencesKeyForViewBounds (NSString *identifier)
{
return [NSString stringWithFormat:@"MASPreferences %@ Frame", identifier];
}
@interface MASPreferencesWindowController () // Private
- (NSViewController <MASPreferencesViewController> *)viewControllerForIdentifier:(NSString *)identifier;
@property (readonly) NSArray *toolbarItemIdentifiers;
@property (nonatomic, retain) NSViewController <MASPreferencesViewController> *selectedViewController;
@end
#pragma mark -
@implementation MASPreferencesWindowController
@synthesize viewControllers = _viewControllers;
@synthesize selectedViewController = _selectedViewController;
@synthesize title = _title;
@synthesize toolbar = _toolbar;
#pragma mark -
- (id)initWithViewControllers:(NSArray *)viewControllers
{
return [self initWithViewControllers:viewControllers title:nil];
}
- (id)initWithViewControllers:(NSArray *)viewControllers title:(NSString *)title
{
if ((self = [super initWithWindowNibName:@"MASPreferencesWindow"]))
{
_viewControllers = [NSMutableArray arrayWithArray: viewControllers];
#if !__has_feature(objc_arc)
_viewControllers = [_viewControllers retain];
#endif
_minimumViewRects = [[NSMutableDictionary alloc] init];
_title = [title copy];
}
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[[self window] setDelegate:nil];
#if !__has_feature(objc_arc)
[_viewControllers release];
[_selectedViewController release];
[_minimumViewRects release];
[_title release];
[super dealloc];
#endif
}
- (void)addViewController: (NSViewController <MASPreferencesViewController> *) viewController
{
[_viewControllers addObject: viewController];
[_toolbar insertItemWithItemIdentifier: [viewController identifier] atIndex: ([_viewControllers count] - 1)];
[_toolbar validateVisibleItems];
}
#pragma mark -
- (void)windowDidLoad
{
if ([self.title length] > 0)
[[self window] setTitle:self.title];
if ([self.viewControllers count])
self.selectedViewController = [self viewControllerForIdentifier:[[NSUserDefaults standardUserDefaults] stringForKey:kMASPreferencesSelectedViewKey]] ?: [self firstViewController];
NSString *origin = [[NSUserDefaults standardUserDefaults] stringForKey:kMASPreferencesFrameTopLeftKey];
if (origin)
[self.window setFrameTopLeftPoint:NSPointFromString(origin)];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidMove:) name:NSWindowDidMoveNotification object:self.window];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:self.window];
}
- (NSViewController <MASPreferencesViewController> *)firstViewController {
for (id viewController in self.viewControllers)
if ([viewController isKindOfClass:[NSViewController class]])
return viewController;
return nil;
}
#pragma mark -
#pragma mark NSWindowDelegate
- (BOOL)windowShouldClose:(id)sender
{
return !self.selectedViewController || [self.selectedViewController commitEditing];
}
- (void)windowDidMove:(NSNotification*)aNotification
{
[[NSUserDefaults standardUserDefaults] setObject:NSStringFromPoint(NSMakePoint(NSMinX([self.window frame]), NSMaxY([self.window frame]))) forKey:kMASPreferencesFrameTopLeftKey];
}
- (void)windowDidResize:(NSNotification*)aNotification
{
NSViewController <MASPreferencesViewController> *viewController = self.selectedViewController;
if (viewController)
[[NSUserDefaults standardUserDefaults] setObject:NSStringFromRect([viewController.view bounds]) forKey:PreferencesKeyForViewBounds(viewController.identifier)];
}
#pragma mark -
#pragma mark Accessors
- (NSArray *)toolbarItemIdentifiers
{
NSMutableArray *identifiers = [NSMutableArray arrayWithCapacity:_viewControllers.count];
for (id viewController in _viewControllers)
if (viewController == [NSNull null])
[identifiers addObject:NSToolbarFlexibleSpaceItemIdentifier];
else
[identifiers addObject:[viewController identifier]];
return identifiers;
}
#pragma mark -
- (NSUInteger)indexOfSelectedController
{
NSUInteger index = [self.toolbarItemIdentifiers indexOfObject:self.selectedViewController.identifier];
return index;
}
#pragma mark -
#pragma mark NSToolbarDelegate
- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar
{
NSArray *identifiers = self.toolbarItemIdentifiers;
return identifiers;
}
- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar
{
NSArray *identifiers = self.toolbarItemIdentifiers;
return identifiers;
}
- (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar
{
NSArray *identifiers = self.toolbarItemIdentifiers;
return identifiers;
}
- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
{
NSToolbarItem *toolbarItem = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier];
NSArray *identifiers = self.toolbarItemIdentifiers;
NSUInteger controllerIndex = [identifiers indexOfObject:itemIdentifier];
if (controllerIndex != NSNotFound)
{
id <MASPreferencesViewController> controller = [_viewControllers objectAtIndex:controllerIndex];
toolbarItem.image = controller.toolbarItemImage;
toolbarItem.label = controller.toolbarItemLabel;
toolbarItem.target = self;
toolbarItem.action = @selector(toolbarItemDidClick:);
}
#if !__has_feature(objc_arc)
[toolbarItem autorelease];
#endif
return toolbarItem;
}
#pragma mark -
#pragma mark Private methods
- (void)clearResponderChain
{
// Remove view controller from the responder chain
NSResponder *chainedController = self.window.nextResponder;
if ([self.viewControllers indexOfObject:chainedController] == NSNotFound)
return;
self.window.nextResponder = chainedController.nextResponder;
chainedController.nextResponder = nil;
}
- (void)patchResponderChain
{
[self clearResponderChain];
NSViewController *selectedController = self.selectedViewController;
if (!selectedController)
return;
// Add current controller to the responder chain
NSResponder *nextResponder = self.window.nextResponder;
self.window.nextResponder = selectedController;
selectedController.nextResponder = nextResponder;
}
- (NSViewController <MASPreferencesViewController> *)viewControllerForIdentifier:(NSString *)identifier
{
for (id viewController in self.viewControllers) {
if (viewController == [NSNull null]) continue;
if ([[viewController identifier] isEqualToString:identifier])
return viewController;
}
return nil;
}
#pragma mark -
- (void)setSelectedViewController:(NSViewController <MASPreferencesViewController> *)controller
{
if (_selectedViewController == controller)
return;
if (_selectedViewController)
{
// Check if we can commit changes for old controller
if (![_selectedViewController commitEditing])
{
[[self.window toolbar] setSelectedItemIdentifier:_selectedViewController.identifier];
return;
}
#if __has_feature(objc_arc)
[self.window setContentView:[[NSView alloc] init]];
#else
[self.window setContentView:[[[NSView alloc] init] autorelease]];
#endif
if ([_selectedViewController respondsToSelector:@selector(viewDidDisappear)])
[_selectedViewController viewDidDisappear];
#if !__has_feature(objc_arc)
[_selectedViewController release];
#endif
_selectedViewController = nil;
}
if (!controller)
return;
// Retrieve the new window tile from the controller view
if ([self.title length] == 0)
{
NSString *label = controller.toolbarItemLabel;
self.window.title = label;
}
[[self.window toolbar] setSelectedItemIdentifier:controller.identifier];
// Record new selected controller in user defaults
[[NSUserDefaults standardUserDefaults] setObject:controller.identifier forKey:kMASPreferencesSelectedViewKey];
NSView *controllerView = controller.view;
// Retrieve current and minimum frame size for the view
NSString *oldViewRectString = [[NSUserDefaults standardUserDefaults] stringForKey:PreferencesKeyForViewBounds(controller.identifier)];
NSString *minViewRectString = [_minimumViewRects objectForKey:controller.identifier];
if (!minViewRectString)
[_minimumViewRects setObject:NSStringFromRect(controllerView.bounds) forKey:controller.identifier];
BOOL sizableWidth = ([controller respondsToSelector:@selector(hasResizableWidth)]
? controller.hasResizableWidth
: controllerView.autoresizingMask & NSViewWidthSizable);
BOOL sizableHeight = ([controller respondsToSelector:@selector(hasResizableHeight)]
? controller.hasResizableHeight
: controllerView.autoresizingMask & NSViewHeightSizable);
NSRect oldViewRect = oldViewRectString ? NSRectFromString(oldViewRectString) : controllerView.bounds;
NSRect minViewRect = minViewRectString ? NSRectFromString(minViewRectString) : controllerView.bounds;
oldViewRect.size.width = NSWidth(oldViewRect) < NSWidth(minViewRect) || !sizableWidth ? NSWidth(minViewRect) : NSWidth(oldViewRect);
oldViewRect.size.height = NSHeight(oldViewRect) < NSHeight(minViewRect) || !sizableHeight ? NSHeight(minViewRect) : NSHeight(oldViewRect);
[controllerView setFrame:oldViewRect];
// Calculate new window size and position
NSRect oldFrame = [self.window frame];
NSRect newFrame = [self.window frameRectForContentRect:oldViewRect];
newFrame = NSOffsetRect(newFrame, NSMinX(oldFrame), NSMaxY(oldFrame) - NSMaxY(newFrame));
// Setup min/max sizes and show/hide resize indicator
[self.window setContentMinSize:minViewRect.size];
[self.window setContentMaxSize:NSMakeSize(sizableWidth ? CGFLOAT_MAX : NSWidth(oldViewRect), sizableHeight ? CGFLOAT_MAX : NSHeight(oldViewRect))];
[self.window setShowsResizeIndicator:sizableWidth || sizableHeight];
[[self.window standardWindowButton:NSWindowZoomButton] setEnabled:sizableWidth || sizableHeight];
[self.window setFrame:newFrame display:YES animate:[self.window isVisible]];
#if __has_feature(objc_arc)
_selectedViewController = controller;
#else
_selectedViewController = [controller retain];
#endif
if ([controller respondsToSelector:@selector(viewWillAppear)])
[controller viewWillAppear];
[self.window setContentView:controllerView];
[self.window recalculateKeyViewLoop];
if ([self.window firstResponder] == self.window) {
if ([controller respondsToSelector:@selector(initialKeyView)])
[self.window makeFirstResponder:[controller initialKeyView]];
else
[self.window selectKeyViewFollowingView:controllerView];
}
// Insert view controller into responder chain
[self patchResponderChain];
[[NSNotificationCenter defaultCenter] postNotificationName:kMASPreferencesWindowControllerDidChangeViewNotification object:self];
}
- (void)toolbarItemDidClick:(id)sender
{
if ([sender respondsToSelector:@selector(itemIdentifier)])
self.selectedViewController = [self viewControllerForIdentifier:[sender itemIdentifier]];
}
#pragma mark -
#pragma mark Public methods
- (void)selectControllerAtIndex:(NSUInteger)controllerIndex
{
if (NSLocationInRange(controllerIndex, NSMakeRange(0, _viewControllers.count)))
self.selectedViewController = [self.viewControllers objectAtIndex:controllerIndex];
}
#pragma mark -
#pragma mark Actions
- (IBAction)goNextTab:(id)sender
{
NSUInteger selectedIndex = self.indexOfSelectedController;
NSUInteger numberOfControllers = [_viewControllers count];
do { selectedIndex = (selectedIndex + 1) % numberOfControllers; }
while ([_viewControllers objectAtIndex:selectedIndex] == [NSNull null]);
[self selectControllerAtIndex:selectedIndex];
}
- (IBAction)goPreviousTab:(id)sender
{
NSUInteger selectedIndex = self.indexOfSelectedController;
NSUInteger numberOfControllers = [_viewControllers count];
do { selectedIndex = (selectedIndex + numberOfControllers - 1) % numberOfControllers; }
while ([_viewControllers objectAtIndex:selectedIndex] == [NSNull null]);
[self selectControllerAtIndex:selectedIndex];
}
@end
@@ -1,25 +0,0 @@
//
// 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
@@ -1,92 +0,0 @@
//
// NSColor+RBLCGColorAdditions.m
// Rebel
//
// Created by Justin Spahr-Summers on 01.12.11.
// Copyright (c) 2012 GitHub. All rights reserved.
//
// Portions copyright (c) 2011 Bitswift. All rights reserved.
// See the LICENSE file for more information.
//
#import "NSColor+RBLCGColorAdditions.h"
static void drawCGImagePattern (void *info, CGContextRef context) {
CGImageRef image = info;
size_t width = CGImageGetWidth(image);
size_t height = CGImageGetHeight(image);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
}
static void releasePatternInfo (void *info) {
CFRelease(info);
}
@implementation NSColor (RBLCGColorAdditions)
+ (NSColor *)rbl_colorWithCGColor:(CGColorRef)color {
if (color == nil) {
return nil;
}
CGColorSpaceRef colorSpaceRef = CGColorGetColorSpace(color);
NSColorSpace *colorSpace = [[NSColorSpace alloc] initWithCGColorSpace:colorSpaceRef];
NSColor *result = [self colorWithColorSpace:colorSpace components:CGColorGetComponents(color) count:(size_t)CGColorGetNumberOfComponents(color)];
[colorSpace release];
return result;
}
- (CGColorRef)rbl_CGColor {
if ([self.colorSpaceName isEqualToString:NSPatternColorSpace]) {
CGImageRef patternImage = [self.patternImage CGImageForProposedRect:NULL context:nil hints:nil];
if (patternImage == NULL) {
return NULL;
}
size_t width = CGImageGetWidth(patternImage);
size_t height = CGImageGetHeight(patternImage);
CGRect patternBounds = CGRectMake(0, 0, width, height);
CGPatternRef pattern = CGPatternCreate(
// Released in releasePatternInfo().
(void *)CFRetain(patternImage),
patternBounds,
CGAffineTransformIdentity,
width,
height,
kCGPatternTilingConstantSpacingMinimalDistortion,
YES,
&(CGPatternCallbacks){
.version = 0,
.drawPattern = &drawCGImagePattern,
.releaseInfo = &releasePatternInfo
}
);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreatePattern(NULL);
CGColorRef result = CGColorCreateWithPattern(colorSpaceRef, pattern, (CGFloat[]){ 1.0 });
CGColorSpaceRelease(colorSpaceRef);
CGPatternRelease(pattern);
return (CGColorRef)[(id)result autorelease];
}
NSColorSpace *colorSpace = NSColorSpace.genericRGBColorSpace;
NSColor *color = [self colorUsingColorSpace:colorSpace];
CGFloat components[color.numberOfComponents];
[color getComponents:components];
CGColorSpaceRef colorSpaceRef = colorSpace.CGColorSpace;
CGColorRef result = CGColorCreate(colorSpaceRef, components);
return (CGColorRef)[(id)result autorelease];
}
@end
-27
View File
@@ -1,27 +0,0 @@
//
// 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
-52
View File
@@ -1,52 +0,0 @@
//
// RBLClipView.m
// Rebel
//
// Created by Justin Spahr-Summers on 2012-09-14.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import "RBLClipView.h"
#import "NSColor+RBLCGColorAdditions.h"
@implementation RBLClipView
#pragma mark Properties
@dynamic layer;
- (NSColor *)backgroundColor {
return [NSColor rbl_colorWithCGColor:self.layer.backgroundColor];
}
- (void)setBackgroundColor:(NSColor *)color {
self.layer.backgroundColor = color.rbl_CGColor;
}
- (BOOL)isOpaque {
return self.layer.opaque;
}
- (void)setOpaque:(BOOL)opaque {
self.layer.opaque = opaque;
}
#pragma mark Lifecycle
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self == nil) return nil;
self.layer = [CAScrollLayer layer];
self.wantsLayer = YES;
self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawNever;
// Matches default NSClipView settings.
self.backgroundColor = NSColor.clearColor;
self.opaque = NO;
return self;
}
@end
-17
View File
@@ -1,17 +0,0 @@
//
// RBLScrollView.h
// Rebel
//
// Created by Jonathan Willing on 12/4/12.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import <Cocoa/Cocoa.h>
// A NSScrollView subclass which uses an instance of RBLClipView
// as the clip view instead of NSClipView.
//
// Layer-backed by default.
@interface RBLScrollView : NSScrollView
@end
-43
View File
@@ -1,43 +0,0 @@
//
// 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
-13
View File
@@ -1,13 +0,0 @@
//
// main.m
// Mousecape
//
// Created by Alex Zielenski on 2/1/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
int main(int argc, const char * argv[]) {
@autoreleasepool {
return NSApplicationMain(argc, argv);
}
}
@@ -1,36 +0,0 @@
//
// NSFileManager+DirectoryLocations.h
//
// Created by Matt Gallagher on 06 May 2010
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software. Permission is granted to anyone to
// use this software for any purpose, including commercial applications, and to
// alter it and redistribute it freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source
// distribution.
//
#import <Foundation/Foundation.h>
//
// DirectoryLocations is a set of global methods for finding the fixed location
// directoriess.
//
@interface NSFileManager (DirectoryLocations)
- (NSString *)findOrCreateDirectory:(NSSearchPathDirectory)searchPathDirectory
inDomain:(NSSearchPathDomainMask)domainMask
appendPathComponent:(NSString *)appendComponent
error:(NSError **)errorOut;
- (NSString *)applicationSupportDirectory;
@end
@@ -1,155 +0,0 @@
//
// NSFileManager+DirectoryLocations.m
//
// Created by Matt Gallagher on 06 May 2010
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software. Permission is granted to anyone to
// use this software for any purpose, including commercial applications, and to
// alter it and redistribute it freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source
// distribution.
//
#import "NSFileManager+DirectoryLocations.h"
enum
{
DirectoryLocationErrorNoPathFound,
DirectoryLocationErrorFileExistsAtLocation
};
NSString * const DirectoryLocationDomain = @"DirectoryLocationDomain";
@implementation NSFileManager (DirectoryLocations)
//
// findOrCreateDirectory:inDomain:appendPathComponent:error:
//
// Method to tie together the steps of:
// 1) Locate a standard directory by search path and domain mask
// 2) Select the first path in the results
// 3) Append a subdirectory to that path
// 4) Create the directory and intermediate directories if needed
// 5) Handle errors by emitting a proper NSError object
//
// Parameters:
// searchPathDirectory - the search path passed to NSSearchPathForDirectoriesInDomains
// domainMask - the domain mask passed to NSSearchPathForDirectoriesInDomains
// appendComponent - the subdirectory appended
// errorOut - any error from file operations
//
// returns the path to the directory (if path found and exists), nil otherwise
//
- (NSString *)findOrCreateDirectory:(NSSearchPathDirectory)searchPathDirectory
inDomain:(NSSearchPathDomainMask)domainMask
appendPathComponent:(NSString *)appendComponent
error:(NSError **)errorOut
{
//
// Search for the path
//
NSArray* paths = NSSearchPathForDirectoriesInDomains(
searchPathDirectory,
domainMask,
YES);
if ([paths count] == 0)
{
if (errorOut)
{
NSDictionary *userInfo =
[NSDictionary dictionaryWithObjectsAndKeys:
NSLocalizedStringFromTable(
@"No path found for directory in domain.",
@"Errors",
nil),
NSLocalizedDescriptionKey,
[NSNumber numberWithInteger:searchPathDirectory],
@"NSSearchPathDirectory",
[NSNumber numberWithInteger:domainMask],
@"NSSearchPathDomainMask",
nil];
*errorOut =
[NSError
errorWithDomain:DirectoryLocationDomain
code:DirectoryLocationErrorNoPathFound
userInfo:userInfo];
}
return nil;
}
//
// Normally only need the first path returned
//
NSString *resolvedPath = [paths objectAtIndex:0];
//
// Append the extra path component
//
if (appendComponent)
{
resolvedPath = [resolvedPath
stringByAppendingPathComponent:appendComponent];
}
//
// Create the path if it doesn't exist
//
NSError *error = nil;
BOOL success = [self
createDirectoryAtPath:resolvedPath
withIntermediateDirectories:YES
attributes:nil
error:&error];
if (!success)
{
if (errorOut)
{
*errorOut = error;
}
return nil;
}
//
// If we've made it this far, we have a success
//
if (errorOut)
{
*errorOut = nil;
}
return resolvedPath;
}
//
// applicationSupportDirectory
//
// Returns the path to the applicationSupportDirectory (creating it if it doesn't
// exist).
//
- (NSString *)applicationSupportDirectory
{
NSString *executableName =
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleExecutable"];
NSError *error;
NSString *result =
[self
findOrCreateDirectory:NSApplicationSupportDirectory
inDomain:NSUserDomainMask
appendPathComponent:executableName
error:&error];
if (!result)
{
NSLog(@"Unable to find or create application support directory:\n%@", error);
}
return result;
}
@end
@@ -1,27 +0,0 @@
//
// NSOrderedSet+AZSortedInsert.h
// Mousecape
//
// Created by Alex Zielenski on 6/26/13.
// Copyright (c) 2013 Alex Zielenski. All rights reserved.
//
#import <Foundation/Foundation.h>
// Adapted from NSArray+CWSortedInsert
@interface NSOrderedSet (AZSortedInsert)
- (NSUInteger)indexForInsertingObject:(id)anObject sortedUsingfunction:(NSInteger (*)(id, id, void *))compare context:(void *)context;
- (NSUInteger)indexForInsertingObject:(id)anObject sortedUsingComparator:(NSComparator)comparator;
- (NSUInteger)indexForInsertingObject:(id)anObject sortedUsingSelector:(SEL)aSelector;
- (NSUInteger)indexForInsertingObject:(id)anObject sortedUsingDescriptors:(NSArray *)descriptors;
@end
@interface NSMutableOrderedSet (AZSortedInsert)
- (void)insertObject:(id)anObject sortedUsingfunction:(NSInteger (*)(id, id, void *))compare context:(void *)context;
- (void)insertObject:(id)anObject sortedUsingSelector:(SEL)aSelector;
- (void)insertObject:(id)anObject sortedUsingDescriptors:(NSArray *)descriptors;
@end
@@ -1,92 +0,0 @@
//
// NSOrderedSet+AZSortedInsert.m
// Mousecape
//
// Created by Alex Zielenski on 6/26/13.
// Copyright (c) 2013 Alex Zielenski. All rights reserved.
//
#import "NSOrderedSet+AZSortedInsert.h"
#import <objc/message.h>
@implementation NSOrderedSet (AZSortedInsert)
- (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:)];
while (index < topIndex) {
NSUInteger midIndex = (index + topIndex) / 2;
id testObject = [self objectAtIndex:midIndex];
// id testObject = objectAtIndexImp(self, @selector(objectAtIndex:), midIndex);
if (compare(anObject, testObject, context) > 0) {
index = midIndex + 1;
} else {
topIndex = midIndex;
}
}
return index;
}
static NSComparisonResult cw_SelectorCompare(id a, id b, void* aSelector) {
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) {
return comparator(a, b);
}
- (NSUInteger)indexForInsertingObject:(id)anObject sortedUsingSelector:(SEL)aSelector; {
return [self indexForInsertingObject:anObject sortedUsingfunction:&cw_SelectorCompare context:aSelector];
}
- (NSUInteger)indexForInsertingObject:(id)anObject sortedUsingComparator:(NSComparator)comparator {
return [self indexForInsertingObject:anObject sortedUsingfunction:(NSInteger (*)(id, id, void *))&az_comparatorCompare context:comparator];
}
static IMP cw_compareObjectToObjectImp = NULL;
static IMP cw_ascendingImp = NULL;
+ (void)initialize; {
cw_compareObjectToObjectImp = [NSSortDescriptor instanceMethodForSelector:@selector(compareObject:toObject:)];
cw_ascendingImp = [NSSortDescriptor instanceMethodForSelector:@selector(ascending)];
}
static NSComparisonResult cw_DescriptorCompare(id a, id b, void* descriptors) {
NSComparisonResult result = NSOrderedSame;
for (NSSortDescriptor* sortDescriptor in (NSArray *)descriptors) {
result = [sortDescriptor compareObject:a toObject:b];
// result = (NSComparisonResult)cw_compareObjectToObjectImp(sortDescriptor, @selector(compareObject:toObject:), a, b);
if (result != NSOrderedSame) {
break;
}
}
return result;
}
- (NSUInteger)indexForInsertingObject:(id)anObject sortedUsingDescriptors:(NSArray *)descriptors;
{
return [self indexForInsertingObject:anObject sortedUsingfunction:&cw_DescriptorCompare context:descriptors];
}
@end
@implementation NSMutableOrderedSet (AZSortedInsert)
- (void)insertObject:(id)anObject sortedUsingfunction:(NSInteger (*)(id, id, void *))compare context:(void *)context; {
NSUInteger index = [self indexForInsertingObject:anObject sortedUsingfunction:compare context:context];
[self insertObject:anObject atIndex:index];
}
- (void)insertObject:(id)anObject sortedUsingSelector:(SEL)aSelector; {
NSUInteger index = [self indexForInsertingObject:anObject sortedUsingfunction:&cw_SelectorCompare context:aSelector];
[self insertObject:anObject atIndex:index];
}
- (void)insertObject:(id)anObject sortedUsingDescriptors:(NSArray *)descriptors; {
NSUInteger index = [self indexForInsertingObject:anObject sortedUsingDescriptors:descriptors];
[self insertObject:anObject atIndex:index];
}
@end
@@ -1,14 +0,0 @@
//
// MCEditCapeController.h
// Mousecape
//
// Created by Alex Zielenski on 2/3/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "MCCursorLibrary.h"
@interface MCEditCapeController : NSViewController
@property (strong) MCCursorLibrary *cursorLibrary;
@end
@@ -1,38 +0,0 @@
//
// MCEditCapeController.m
// Mousecape
//
// Created by Alex Zielenski on 2/3/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import "MCEditCapeController.h"
#import "MCLibraryController.h"
@interface MCEditCapeController ()
@end
@implementation MCEditCapeController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
// Initialization code here.
}
return self;
}
- (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;
}
return YES;
}
@end
@@ -1,23 +0,0 @@
//
// MCEditDetailController.h
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "MCCursor.h"
#import "MMAnimatingImageView.h"
@interface MCEditDetailController : NSViewController <MMAnimatingImageViewDelegate>
@property (strong) MCCursor *cursor;
@property (assign) IBOutlet NSPopUpButton *typePopUpButton;
@property (assign) IBOutlet MMAnimatingImageView *rep100View;
@property (assign) IBOutlet MMAnimatingImageView *rep200View;
@property (assign) IBOutlet MMAnimatingImageView *rep500View;
@property (assign) IBOutlet MMAnimatingImageView *rep1000View;
@end
@interface MCCursorTypeValueTransformer : NSValueTransformer
@end
@@ -1,103 +0,0 @@
//
// MCEditDetailController.m
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import "MCEditDetailController.h"
@interface MCEditDetailController ()
@end
@implementation MCEditDetailController
- (void)awakeFromNib {
[self.typePopUpButton addItemsWithTitles:[cursorMap().allValues sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]];
NSImage *dropzone = [NSImage imageNamed:@"dropzone"];
self.rep100View.placeholderImage = dropzone;
self.rep200View.placeholderImage = dropzone;
self.rep500View.placeholderImage = dropzone;
self.rep1000View.placeholderImage = dropzone;
self.rep100View.scale = 1.0;
self.rep200View.scale = 2.0;
self.rep500View.scale = 5.0;
self.rep1000View.scale = 10.0;
[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];
[self.rep100View bind:@"hotSpot" toObject:self withKeyPath:@"cursor.hotSpot" options:nil];
[self.rep200View bind:@"image" toObject:self withKeyPath:@"cursor.cursorImage200" options:nil];
[self.rep200View bind:@"frameCount" toObject:self withKeyPath:@"cursor.frameCount" options:nil];
[self.rep200View bind:@"frameDuration" toObject:self withKeyPath:@"cursor.frameDuration" options:nil];
[self.rep200View bind:@"hotSpot" toObject:self withKeyPath:@"cursor.hotSpot" options:nil];
[self.rep500View bind:@"image" toObject:self withKeyPath:@"cursor.cursorImage500" options:nil];
[self.rep500View bind:@"frameCount" toObject:self withKeyPath:@"cursor.frameCount" options:nil];
[self.rep500View bind:@"frameDuration" toObject:self withKeyPath:@"cursor.frameDuration" options:nil];
[self.rep500View bind:@"hotSpot" toObject:self withKeyPath:@"cursor.hotSpot" options:nil];
[self.rep1000View bind:@"image" toObject:self withKeyPath:@"cursor.cursorImage1000" options:nil];
[self.rep1000View bind:@"frameCount" toObject:self withKeyPath:@"cursor.frameCount" options:nil];
[self.rep1000View bind:@"frameDuration" toObject:self withKeyPath:@"cursor.frameDuration" options:nil];
[self.rep1000View bind:@"hotSpot" toObject:self withKeyPath:@"cursor.hotSpot" options:nil];
}
#pragma mark - MMAnimatingImageView
- (NSDragOperation)imageView:(MMAnimatingImageView *)imageView draggingEntered:(id <NSDraggingInfo>)drop {
return NSDragOperationCopy;
}
- (BOOL)imageView:(MMAnimatingImageView *)imageView shouldPrepareForDragOperation:(id <NSDraggingInfo>)drop {
return YES;
}
- (BOOL)imageView:(MMAnimatingImageView *)imageView shouldPerformDragOperation:(id <NSDraggingInfo>)drop {
return YES;
}
- (void)imageView:(MMAnimatingImageView *)imageView didAcceptDroppedImages:(NSArray *)images {
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 {
CGFloat scale = imageView.scale;
[self.cursor setRepresentation:nil forScale:cursorScaleForScale(scale)];
}
@end
@implementation MCCursorTypeValueTransformer
+ (Class)transformedValueClass {
return [NSString class];
}
+ (BOOL)allowsReverseTransformation {
return YES;
}
- (id)transformedValue:(id)value {
return nameForCursorIdentifier(value);
}
- (id)reverseTransformedValue:(id)value {
return cursorIdentifierForName(value);
}
@end
@@ -1,20 +0,0 @@
//
// MCEditListController.h
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "MCCursorLibrary.h"
@interface MCEditListController : NSViewController <NSTableViewDataSource, NSTableViewDelegate>
@property (strong) MCCursorLibrary *cursorLibrary;
@property (weak) id selectedObject;
@property (assign) IBOutlet NSTableView *tableView;
- (IBAction)addAction:(id)sender;
- (IBAction)removeAction:(id)sender;
- (IBAction)duplicateAction:(id)sender;
@end
@@ -1,201 +0,0 @@
//
// MCEditListController.m
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import "MCEditListController.h"
#import "NSOrderedSet+AZSortedInsert.h"
const char MCEditCursorsContext;
const char MCCursorNameContext;
@interface MCEditListController ()
@property (nonatomic, strong) NSMutableOrderedSet *cursors;
+ (NSComparator)sortComparator;
- (void)startObservingCursor:(MCCursor *)cursor;
- (void)stopObservingCursor:(MCCursor *)cursor;
@end
@implementation MCEditListController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[self addObserver:self forKeyPath:@"cursorLibrary.cursors" options:0 context:NULL];
}
return self;
}
- (id)initWithCoder:(NSCoder *)coder {
if ((self = [super initWithCoder:coder])) {
[self addObserver:self forKeyPath:@"cursorLibrary.cursors" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:(void*)&MCEditCursorsContext];
}
return self;
}
- (void)dealloc {
[self removeObserver:self forKeyPath:@"cursorLibrary.cursors" context:(void *)&MCEditCursorsContext];
for (MCCursor *cursor in self.cursors) {
[self stopObservingCursor:cursor];
}
}
- (void)startObservingCursor:(MCCursor *)cursor {
[cursor addObserver:self forKeyPath:@"name" options:0 context:(void *)&MCCursorNameContext];
}
- (void)stopObservingCursor:(MCCursor *)cursor {
[cursor removeObserver:self forKeyPath:@"name" context:(void *)&MCCursorNameContext];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (context == &MCEditCursorsContext) {
NSKeyValueChange kind = [change[NSKeyValueChangeKindKey] integerValue];
[self.tableView beginUpdates];
if (kind == NSKeyValueChangeSetting) {
id nextSet = change[NSKeyValueChangeNewKey];
if ([nextSet isKindOfClass:[NSNull class]]) {
self.cursors = [NSMutableOrderedSet orderedSet];
} else {
self.cursors = [NSMutableOrderedSet orderedSetWithSet:nextSet copyItems:NO];
[self.cursors sortUsingComparator:self.class.sortComparator];
for (MCCursor *cursor in self.cursors) {
[self startObservingCursor:cursor];
}
}
[self.tableView reloadData];
[self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:0] byExtendingSelection:NO];
} else if (kind == NSKeyValueChangeInsertion) {
for (MCCursor *lib in change[NSKeyValueChangeNewKey]) {
NSUInteger index = [self.cursors indexForInsertingObject:lib sortedUsingComparator:self.class.sortComparator];
NSIndexSet *indices = [NSIndexSet indexSetWithIndex:index];
[self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indices forKey:@"cursors"];
[self.cursors insertObject:lib atIndex:index];
[self startObservingCursor:lib];
[self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indices forKey:@"cursors"];
[self.tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:index + 1] withAnimation:NSTableViewAnimationSlideUp];
}
} else if (kind == NSKeyValueChangeRemoval) {
for (MCCursor *lib in change[NSKeyValueChangeOldKey]) {
NSUInteger index = [self.cursors indexOfObject:lib];
if (index != NSNotFound) {
NSIndexSet *indices = [NSIndexSet indexSetWithIndex:index];
[self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"cursors"];
[self stopObservingCursor:lib];
[self.cursors removeObjectAtIndex:index];
[self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"cursors"];
[self.tableView removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:index + 1] withAnimation:NSTableViewAnimationSlideUp | NSTableViewAnimationEffectFade];
}
}
}
[self.tableView endUpdates];
} else if (context == &MCCursorNameContext) {
// Reorder it
MCCursorLibrary *cape = object;
NSUInteger oldIndex = [self.cursors indexOfObject:cape];
if (oldIndex != NSNotFound) {
[self.cursors removeObjectAtIndex:oldIndex];
NSUInteger newIndex = [self.cursors indexForInsertingObject:cape sortedUsingComparator:self.class.sortComparator];
[self.cursors insertObject:cape atIndex:newIndex];
[self.tableView moveRowAtIndex:oldIndex + 1 toIndex:newIndex + 1];
}
}
}
+ (NSComparator)sortComparator {
static NSComparator sortComparator = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sortComparator = ^NSComparisonResult(id obj1, id obj2) {
return [[obj1 valueForKey:@"name"] localizedCaseInsensitiveCompare:[obj2 valueForKey:@"name"]];
};
});
return sortComparator;
}
- (IBAction)addAction:(id)sender {
[self.cursorLibrary addCursor:[[MCCursor alloc] init]];
}
- (IBAction)removeAction:(NSMenuItem *)sender {
NSInteger row = NSNotFound;
if (sender.tag == -1)
row = self.tableView.clickedRow;
else
row = self.tableView.selectedRow;
if (row > 0)
[self.cursorLibrary removeCursor:[[self.tableView viewAtColumn:0 row:row makeIfNecessary:NO] objectValue]];
}
- (IBAction)duplicateAction:(NSMenuItem *)sender {
NSUInteger row = NSNotFound;
if (sender.tag == -1)
row = self.tableView.clickedRow;
else
row = self.tableView.selectedRow;
if (row > 0) {
MCCursor *cursor = [[[self.tableView viewAtColumn:0 row:row makeIfNecessary:NO] objectValue] copy];
cursor.identifier = UUID();
[self.cursorLibrary addCursor:cursor];
}
}
#pragma mark - NSTableViewDelegate
- (void)tableViewSelectionDidChange:(NSNotification *)notification {
NSInteger selectedRow = [(NSTableView *)self.view selectedRow];
if (selectedRow == NSNotFound || selectedRow >= self.cursors.count + 1)
return;
if (selectedRow == 0)
self.selectedObject = self.cursorLibrary;
else
self.selectedObject = [self.cursors objectAtIndex:selectedRow - 1];
}
- (BOOL)tableView:(NSTableView *)tableView isGroupRow:(NSInteger)row {
return row == 0;
}
- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row {
if (row == 0)
return 32.0;
return 22.0;
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
NSView *view;
if (row == 0)
view = [tableView makeViewWithIdentifier:@"MCCursorLibrary" owner:self];
else
view = [tableView makeViewWithIdentifier:@"MCCursor" owner:self];
return view;
}
#pragma mark - NSTableViewDataSource
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return self.cursors.count + 1;
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
if (row == 0)
return self.cursorLibrary;
return [self.cursors objectAtIndex: row - 1];
}
@end
@@ -1,21 +0,0 @@
//
// MCEditWindowController.h
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "MCEditDetailController.h"
#import "MCEditListController.h"
#import "MCEditCapeController.h"
#import "MCCursorLibrary.h"
@interface MCEditWindowController : NSWindowController <NSWindowDelegate, NSSplitViewDelegate>
@property (assign) IBOutlet MCEditListController *editListController; // List of cursors in the library
@property (assign) IBOutlet MCEditDetailController *editDetailController; // Detail view of the selected cursor
@property (assign) IBOutlet MCEditCapeController *editCapeController; // Detail view of the entire library
@property (assign) IBOutlet NSView *detailView;
@property (assign) MCCursorLibrary *cursorLibrary;
@end
@@ -1,198 +0,0 @@
//
// MCEditWindowController.m
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import "MCEditWindowController.h"
#import "MCLibraryController.h"
@interface MCEditWindowController ()
- (void)_setCurrentViewController:(NSViewController *)vc;
- (BOOL)promptSaveForLibrary:(MCCursorLibrary *)nextLibrary;
@end
@implementation MCEditWindowController
@dynamic cursorLibrary;
- (id)initWithWindow:(NSWindow *)window {
if ((self = [super initWithWindow:window])) {
// Initialization code here.
}
return self;
}
- (void)loadWindow {
[super loadWindow];
[self windowDidLoad];
}
+ (NSSet *)keyPathsForValuesAffectingCursorLibrary {
return [NSSet setWithObject:@"editListController.cursorLibrary"];
}
- (MCCursorLibrary *)cursorLibrary {
return self.editListController.cursorLibrary;
}
- (void)setCursorLibrary:(MCCursorLibrary *)cursorLibrary {
[self promptSaveForLibrary:cursorLibrary];
}
- (BOOL)promptSaveForLibrary:(MCCursorLibrary *)nextLibrary {
if (!self.window.isDocumentEdited) {
self.editListController.cursorLibrary = nextLibrary;
return NO;
}
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;
}
- (void)windowDidLoad {
[super windowDidLoad];
[self.editListController addObserver:self forKeyPath:@"selectedObject" options:0 context:nil];
[self _setCurrentViewController:self.editCapeController];
[self.window bind:@"documentEdited" toObject:self withKeyPath:@"cursorLibrary.dirty" options:nil];
}
- (void)dealloc {
[self.editListController removeObserver:self forKeyPath:@"selectedObject"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"selectedObject"]) {
[self _changeEditViewsForSelection];
}
}
- (BOOL)windowShouldClose:(NSWindow *)window {
return ![self promptSaveForLibrary:nil];
}
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
return self.cursorLibrary.undoManager;
}
- (void)sheetDidDismiss:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(MCCursorLibrary *)contextInfo {
if (returnCode == 0) { // cancel
// do nothing
} else if (returnCode == 1) { // save
NSError *error = [self.cursorLibrary save];
if (!error) {
self.editListController.cursorLibrary = contextInfo;
if (!contextInfo)
[self.window close];
} else {
[NSApp presentError:error modalForWindow:self.window delegate:nil didPresentSelector:NULL contextInfo:nil];
}
} else if (returnCode == -1) { // discard changes
[self.cursorLibrary revertToSaved];
self.editListController.cursorLibrary = contextInfo;
if (!contextInfo)
[self.window close];
}
}
#pragma mark - Menu Actions
- (IBAction)applyCape:(id)sender {
[self.cursorLibrary.library applyCape:self.cursorLibrary];
}
- (IBAction)duplicateCape:(id)sender {
[self.cursorLibrary.library importCape:self.cursorLibrary.copy];
}
- (IBAction)checkCape:(id)sender {
}
- (IBAction)saveDocument:(id)sender {
NSError *error = [self.cursorLibrary save];
if (error)
[self presentError:error modalForWindow:self.window delegate:nil didPresentSelector:NULL contextInfo:NULL];
}
- (IBAction)revertDocumentToSaved:(id)sender {
[self.cursorLibrary revertToSaved];
}
- (IBAction)showCape:(id)sender {
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:@[ self.cursorLibrary.fileURL ]];
}
- (NSError *)willPresentError:(NSError *)error {
return [NSError errorWithDomain:error.domain code:error.code userInfo:@{
NSLocalizedDescriptionKey: error.localizedDescription ?: @"",
NSLocalizedRecoverySuggestionErrorKey: error.localizedFailureReason ?: @""
}];
}
#pragma mark - View Changing
- (void)_changeEditViewsForSelection {
BOOL capeEditor = [self.editListController.selectedObject isKindOfClass:[MCCursorLibrary class]];
if (capeEditor) {
[self _setCurrentViewController:self.editCapeController];
self.editCapeController.cursorLibrary = self.editListController.selectedObject;
} else {
[self _setCurrentViewController:self.editDetailController];
self.editDetailController.cursor = self.editListController.selectedObject;
}
}
- (void)_setCurrentViewController:(NSViewController *)vc {
if ([self.detailView.subviews containsObject:vc.view])
return;
[self.detailView setSubviews:@[]];
[self.detailView removeConstraints:self.detailView.constraints];
NSRect frame = self.detailView.bounds;
vc.view.frame = frame;
// Fill superview with subview
[vc.view setTranslatesAutoresizingMaskIntoConstraints:YES];
[vc.view setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable | NSViewMinYMargin | NSViewMinXMargin];
[self.detailView addSubview:vc.view];
}
#pragma mark - NSSplitViewDelegate
- (BOOL)splitView:(NSSplitView *)splitView canCollapseSubview:(NSView *)subview {
return NO;
}
- (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMin ofSubviewAt:(NSInteger)dividerIndex {
if (dividerIndex == 0) {
return 120.0f;
}
return proposedMin;
}
- (CGFloat)splitView:(NSSplitView *)splitView constrainMaxCoordinate:(CGFloat)proposedMax ofSubviewAt:(NSInteger)dividerIndex {
if (dividerIndex == 0) {
return splitView.frame.size.width - 380.0;
}
return proposedMax;
}
@end
@@ -1,37 +0,0 @@
//
// MCLibraryController.h
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "MCCursorLibrary.h"
@interface MCLibraryController : NSObject
@property (readonly, weak) MCCursorLibrary *appliedCape;
@property (nonatomic, readonly) NSUndoManager *undoManager;
@property (readonly, copy) NSURL *libraryURL;
- (instancetype)initWithURL:(NSURL *)url;
- (void)importCapeAtURL:(NSURL *)url;
- (void)importCape:(MCCursorLibrary *)cape;
- (void)addCape:(MCCursorLibrary *)cape;
- (void)removeCape:(MCCursorLibrary *)cape;
- (void)applyCape:(MCCursorLibrary *)cape;
- (void)restoreCape;
- (NSURL *)URLForCape:(MCCursorLibrary *)cape;
- (NSSet *)capesWithIdentifier:(NSString *)identifier;
- (BOOL)dumpCursorsWithProgressBlock:(BOOL (^)(NSUInteger current, NSUInteger total))block;
@end
@interface MCLibraryController (Capes)
@property (nonatomic, readonly) NSSet *capes;
@end
@@ -1,184 +0,0 @@
//
// MCLibraryController.m
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import "MCLibraryController.h"
#import "NSOrderedSet+AZSortedInsert.h"
#import "apply.h"
#import "restore.h"
#import "create.h"
@interface MCLibraryController ()
@property (nonatomic, readwrite, strong) NSUndoManager *undoManager;
@property (nonatomic, retain) NSMutableSet *capes;
@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"] ]];;
}
- (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];
}
return self;
}
- (void)loadLibrary {
[self.undoManager disableUndoRegistration];
self.capes = [NSMutableSet set];
NSString *capesPath = self.libraryURL.path;
NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:capesPath error:NULL];
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];
if ([library.identifier isEqualToString:applied]) {
self.appliedCape = library;
}
[self addCape:library];
}
[self.undoManager enableUndoRegistration];
}
- (void)importCapeAtURL:(NSURL *)url {
[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];
[self addCape:lib];
}
- (void)addCape:(MCCursorLibrary *)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;
}
if (!cape) {
NSLog(@"Cannot add nil cape");
return;
}
NSSet *change = [NSSet setWithObject:cape];
[self willChangeValueForKey:@"capes" withSetMutation:NSKeyValueUnionSetMutation usingObjects:change];
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];
}
- (void)removeCape:(MCCursorLibrary *)cape {
NSSet *change = [NSSet setWithObject:cape];
[self willChangeValueForKey:@"capes" withSetMutation:NSKeyValueMinusSetMutation usingObjects:change];
if (cape == self.appliedCape)
[self restoreCape];
if (cape.library == self)
cape.library = nil;
[self.capes removeObject:cape];
// Move the file to the trash
NSFileManager *manager = [NSFileManager defaultManager];
NSURL *destinationURL = [NSURL fileURLWithPath:[[@"~/.Trash" stringByExpandingTildeInPath] stringByAppendingPathComponent:cape.fileURL.lastPathComponent] isDirectory:NO];
[manager removeItemAtURL:destinationURL error:NULL];
[manager moveItemAtURL:cape.fileURL toURL:destinationURL error:NULL];
[[self.undoManager prepareWithInvocationTarget:self] importCapeAtURL:destinationURL];
if (!self.undoManager.isUndoing) {
[self.undoManager setActionName:[@"Remove " stringByAppendingString:cape.name]];
}
[self didChangeValueForKey:@"capes" withSetMutation:NSKeyValueMinusSetMutation usingObjects:change];
}
- (void)applyCape:(MCCursorLibrary *)cape {
if (applyCapeAtPath(cape.fileURL.path)) {
self.appliedCape = cape;
}
}
- (void)restoreCape {
resetAllCursors();
self.appliedCape = nil;
}
- (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
@@ -1,25 +0,0 @@
//
// MCLibraryViewController.h
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "MCLibraryController.h"
@interface MCLibraryViewController : NSViewController <NSTableViewDelegate, NSTableViewDataSource>
@property (assign) IBOutlet NSMenu *contextMenu;
@property (assign) IBOutlet NSTableView *tableView;
@property (strong, readonly) MCLibraryController *libraryController;
@property (weak) MCCursorLibrary *editingCape;
@property (weak) MCCursorLibrary *selectedCape;
@property (weak) MCCursorLibrary *clickedCape;
- (void)editCape:(MCCursorLibrary *)library;
@end
@interface MCLibraryController (Properties)
@property (readonly, strong) NSOrderedSet *capes;
@end
@@ -1,212 +0,0 @@
//
// MCLibraryViewController.m
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import "MCLibraryViewController.h"
#import "MCCapeCellView.h"
#import "NSFileManager+DirectoryLocations.h"
#import "MCEditWindowController.h"
#import "NSOrderedSet+AZSortedInsert.h"
const char MCLibraryCapesContext;
const char MCLibraryNameContext;
@interface MCLibraryViewController ()
@property (strong) MCEditWindowController *editWindowController;
@property (readwrite, strong) NSMutableOrderedSet *capes;
@property (strong, readwrite) MCLibraryController *libraryController;
- (void)setupEnvironment;
- (void)doubleClick:(id)sender;
+ (NSString *)capesPath;
+ (NSComparator)sortComparator;
@end
@implementation MCLibraryViewController
@dynamic clickedCape, selectedCape, editingCape;
+ (NSComparator)sortComparator {
static NSComparator sortComparator = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sortComparator = ^NSComparisonResult(id obj1, id obj2) {
NSComparisonResult result = [[obj1 valueForKey:@"name"] localizedCaseInsensitiveCompare:[obj2 valueForKey:@"name"]];
if (result == NSOrderedSame)
result = [[obj1 valueForKey:@"author"] localizedCaseInsensitiveCompare:[obj2 valueForKey:@"author"]];
return result;
};
});
return sortComparator;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
[self setupEnvironment];
}
return self;
}
- (id)initWithCoder:(NSCoder *)coder {
if ((self = [super initWithCoder:coder])) {
[self setupEnvironment];
}
return self;
}
- (void)dealloc {
[self.libraryController removeObserver:self forKeyPath:@"appliedCape"];
for (MCCursorLibrary *library in self.capes) {
[library removeObserver:self forKeyPath:@"name" context:(void *)&MCLibraryNameContext];
}
}
+ (NSString *)capesPath {
return [[NSFileManager defaultManager] findOrCreateDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appendPathComponent:@"Mousecape/capes" error:NULL];
}
- (void)awakeFromNib {
self.tableView.doubleAction = @selector(doubleClick:);
self.tableView.target = self;
}
- (void)setupEnvironment {
[self addObserver:self forKeyPath:@"libraryController.capes" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:(void *)&MCLibraryCapesContext];
self.libraryController = [[MCLibraryController alloc] initWithURL:[NSURL fileURLWithPath:self.class.capesPath]];
[self setRepresentedObject:self.libraryController];
[self.libraryController addObserver:self forKeyPath:NSStringFromSelector(@selector(appliedCape)) options:0 context:NULL];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:NSStringFromSelector(@selector(appliedCape))]) {
for (NSUInteger x = 0; x < self.tableView.numberOfRows; x++) {
MCCapeCellView *cv = [self.tableView viewAtColumn:0 row:x makeIfNecessary:NO];
cv.appliedImageView.hidden = !(cv.objectValue == [self.libraryController appliedCape]);
}
} else if (context == &MCLibraryCapesContext) {
NSKeyValueChange kind = [change[NSKeyValueChangeKindKey] integerValue];
[self.tableView beginUpdates];
if (kind == NSKeyValueChangeInsertion || kind == NSKeyValueChangeSetting) {
if (kind == NSKeyValueChangeSetting) {
self.capes = [NSMutableOrderedSet orderedSet];
}
for (MCCursorLibrary *lib in change[NSKeyValueChangeNewKey]) {
NSUInteger index = [self.capes indexForInsertingObject:lib sortedUsingComparator:self.class.sortComparator];
NSIndexSet *indices = [NSIndexSet indexSetWithIndex:index];
[self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indices forKey:@"capes"];
[lib addObserver:self forKeyPath:@"name" options:0 context:(void *)&MCLibraryNameContext];
[self.capes insertObject:lib atIndex:index];
[self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indices forKey:@"capes"];
[self.tableView insertRowsAtIndexes:indices withAnimation:NSTableViewAnimationSlideUp];
}
} else if (kind == NSKeyValueChangeRemoval) {
for (MCCursorLibrary *lib in change[NSKeyValueChangeOldKey]) {
NSUInteger index = [self.capes indexOfObject:lib];
NSIndexSet *indices = [NSIndexSet indexSetWithIndex:index];
[self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"capes"];
[lib removeObserver:self forKeyPath:@"name" context:(void *)&MCLibraryNameContext];
[self.capes removeObjectAtIndex:index];
[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];
}
}
}
[self.tableView endUpdates];
} else if (context == &MCLibraryNameContext) {
// Reoder it
MCCursorLibrary *cape = object;
NSUInteger oldIndex = [self.capes indexOfObject:cape];
if (oldIndex != NSNotFound) {
[self.capes removeObjectAtIndex:oldIndex];
NSUInteger newIndex = [self.capes indexForInsertingObject:cape sortedUsingComparator:self.class.sortComparator];
[self.capes insertObject:cape atIndex:newIndex];
[self.tableView moveRowAtIndex:oldIndex toIndex:newIndex];
}
} else
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
- (void)doubleClick:(NSTableView *)sender {
NSUInteger row = sender.clickedRow;
MCCursorLibrary *library = [[sender viewAtColumn:0 row:row makeIfNecessary:NO] objectValue];
if ([[NSUserDefaults standardUserDefaults] integerForKey:MCPreferencesDoubleActionKey] == 0)
[self.libraryController applyCape:library];
else {
[self editCape:library];
}
}
#pragma mark - Editing
+ (NSSet *)keyPathsForValuesAffectingEditingCape {
return [NSSet setWithObject:@"editWindowController.cursorLibrary"];
}
- (MCCursorLibrary *)selectedCape {
return [[self.tableView viewAtColumn:0 row:self.tableView.selectedRow makeIfNecessary:NO] objectValue];
}
- (MCCursorLibrary *)clickedCape {
return [[self.tableView viewAtColumn:0 row:self.tableView.clickedRow makeIfNecessary:NO] objectValue];
}
- (MCCursorLibrary *)editingCape {
return self.editWindowController.cursorLibrary;
}
- (void)editCape:(MCCursorLibrary *)library {
if (!library)
return;
if (!self.editWindowController) {
self.editWindowController = [[MCEditWindowController alloc] initWithWindowNibName:@"Edit"];
[self.editWindowController loadWindow];
}
self.editWindowController.cursorLibrary = library;
[self.editWindowController showWindow:self];
}
#pragma mark - NSTableViewDelegate
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return self.capes.count;
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
return self.capes[row];
}
#pragma mark - NSTableViewDelegate
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
MCCapeCellView *cellView = (MCCapeCellView *)[tableView makeViewWithIdentifier:tableColumn.identifier owner:self];
cellView.appliedImageView.hidden = !([self.capes objectAtIndex:row] == self.libraryController.appliedCape);
return cellView;
}
//- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row {
// return nil;
//}
@end
@@ -1,20 +0,0 @@
//
// MCLbraryWindowController.h
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "MCLibraryViewController.h"
@interface MCLibraryWindowController : NSWindowController <NSWindowDelegate>
@property (weak) IBOutlet MCLibraryViewController *libraryViewController;
@property (weak) IBOutlet NSView *appliedAccessory;
@property (weak) IBOutlet NSProgressIndicator *progressBar;
@property (weak) IBOutlet NSTextField *progressField;
@end
@interface MCAppliedCapeValueTransformer : NSValueTransformer
@end
@@ -1,169 +0,0 @@
//
// MCLbraryWindowController.m
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import "MCLibraryWindowController.h"
@interface MCLibraryWindowController ()
- (void)composeAccessory;
@end
@implementation MCLibraryWindowController
- (void)awakeFromNib {
[self composeAccessory];
}
- (id)initWithWindow:(NSWindow *)window {
if ((self = [super initWithWindow:window])) {
}
return self;
}
- (void)windowDidLoad {
NSLog(@"window load");
[super windowDidLoad];
[self composeAccessory];
}
- (NSString *)windowNibName {
return @"Library";
}
- (void)composeAccessory {
NSView *themeFrame = [self.window.contentView superview];
NSView *accessory = self.appliedAccessory;
[accessory setTranslatesAutoresizingMaskIntoConstraints:NO];
NSRect c = themeFrame.frame;
NSRect aV = accessory.frame;
NSRect newFrame = NSMakeRect(
c.size.width - aV.size.width, // x position
c.size.height - aV.size.height, // y position
aV.size.width, // width
aV.size.height); // height
[accessory setFrame:newFrame];
[themeFrame addSubview:accessory];
[themeFrame addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-(>=100)-[accessory(245)]-(0)-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(accessory)]];
[themeFrame addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-(0)-[accessory(20)]-(>=22)-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(accessory)]];
}
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
return self.libraryViewController.libraryController.undoManager;
}
#pragma mark - Menu Actions
- (IBAction)applyCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
else
cape = self.libraryViewController.selectedCape;
[self.libraryViewController.libraryController applyCape:cape];
}
- (IBAction)editCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
else
cape = self.libraryViewController.selectedCape;
[self.libraryViewController editCape:cape];
}
- (IBAction)removeCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
else
cape = self.libraryViewController.selectedCape;
if (cape != self.libraryViewController.editingCape) {
[self.libraryViewController.libraryController removeCape:cape];
} else {
[[NSSound soundNamed:@"Funk"] play];
[self.libraryViewController editCape:self.libraryViewController.editingCape];
}
}
- (IBAction)duplicateCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
else
cape = self.libraryViewController.selectedCape;
[self.libraryViewController.libraryController importCape:cape.copy];
}
- (IBAction)checkCapeAction:(NSMenuItem *)sender {
}
- (IBAction)showCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
else
cape = self.libraryViewController.selectedCape;
[[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
+ (Class)transformedValueClass {
return [NSString class];
}
- (id)transformedValue:(id)value {
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
@@ -1,151 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6205"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MCGeneralPreferencesController">
<connections>
<outlet property="view" destination="1" id="2"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="1">
<rect key="frame" x="0.0" y="0.0" width="480" height="143"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" 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" 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" 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" 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"/>
<segment label="edit" width="54" selected="YES" tag="1"/>
</segments>
</segmentedCell>
<connections>
<binding destination="Dw0-Gt-5ak" name="selectedIndex" keyPath="values.MCDoubleAction" id="GuD-im-CgM">
<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>
<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" 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"/>
</numberFormatter>
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<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>
@@ -1,14 +0,0 @@
//
// MCGeneralPreferencesController.h
// Mousecape
//
// Created by Alex Zielenski on 2/9/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "MASPreferencesViewController.h"
@interface MCGeneralPreferencesController : NSViewController <MASPreferencesViewController>
@property (assign) float cursorScale;
@end
@@ -1,58 +0,0 @@
//
// MCGeneralPreferencesController.m
// Mousecape
//
// Created by Alex Zielenski on 2/9/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import "MCGeneralPreferencesController.h"
#import "scale.h"
@interface MCGeneralPreferencesController ()
@end
@implementation MCGeneralPreferencesController
@dynamic cursorScale;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
}
return self;
}
- (id)init {
return [self initWithNibName:@"GeneralPreferences" bundle:nil];
}
#pragma mark - Accessors
- (float)cursorScale {
return cursorScale();
}
- (void)setCursorScale:(float)cursorScale {
[self willChangeValueForKey:@"cursorScale"];
setCursorScale(cursorScale);
[[NSUserDefaults standardUserDefaults] setFloat:cursorScale forKey:MCPreferencesCursorScaleKey];
[self didChangeValueForKey:@"cursorScale"];
}
#pragma mark -
#pragma mark MASPreferencesViewController
- (NSString *)identifier {
return @"GeneralPreferences";
}
- (NSImage *)toolbarItemImage {
return [NSImage imageNamed:NSImageNamePreferencesGeneral];
}
- (NSString *)toolbarItemLabel {
return NSLocalizedString(@"General", @"Toolbar item name for the General preference pane");
}
@end
-50
View File
@@ -1,50 +0,0 @@
//
// MCCursor.h
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSUInteger, MCCursorScale) {
MCCursorScaleNone = 000,
MCCursorScale100 = 100,
MCCursorScale200 = 200,
MCCursorScale500 = 500,
MCCursorScale1000 = 1000
};
extern MCCursorScale cursorScaleForScale(CGFloat scale);
@interface MCCursor : NSObject <NSCopying>
@property (nonatomic, copy) NSString *identifier;
@property (nonatomic, readonly) NSString *name;
@property (nonatomic, assign) CGFloat frameDuration;
@property (nonatomic, assign) NSUInteger frameCount;
@property (nonatomic, assign) NSSize size;
@property (nonatomic, assign) NSPoint hotSpot;
//@property (assign) NSUInteger repeatCount; // v2.01
// creating a cursor from a dictionary
+ (MCCursor *)cursorWithDictionary:(NSDictionary *)dict ofVersion:(CGFloat)version;
- (id)initWithCursorDictionary:(NSDictionary *)dict ofVersion:(CGFloat)version;
- (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;
@end
@interface MCCursor (Properties)
@property (nonatomic, readonly, strong) NSDictionary *representations;
@end
-311
View File
@@ -1,311 +0,0 @@
//
// MCCursor.m
// Mousecape
//
// Created by Alex Zielenski on 2/2/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import "MCCursor.h"
#import "NSBitmapImageRep+ColorSpace.h"
MCCursorScale cursorScaleForScale(CGFloat scale) {
if (scale < 0.0)
return MCCursorScaleNone;
return (MCCursorScale)((NSInteger)scale * 100);
}
@interface MCCursor ()
@property (readwrite, strong) NSMutableDictionary<NSString *, NSBitmapImageRep *> *representations;
- (NSInteger)framesForScale:(MCCursorScale)scale;
- (BOOL)_readFromDictionary:(NSDictionary *)dictionary ofVersion:(CGFloat)version;
@end
@implementation MCCursor
@dynamic name;
+ (MCCursor *)cursorWithDictionary:(NSDictionary *)dict ofVersion:(CGFloat)version {
return [[self alloc] initWithCursorDictionary:dict ofVersion:version];
}
- (id)init {
if ((self = [super init])) {
self.frameCount = 1;
self.frameDuration = 1.0;
self.size = NSZeroSize;
self.hotSpot = NSZeroPoint;
self.identifier = [UUID() stringByReplacingOccurrencesOfString:@"-" withString:@""];
self.representations = [NSMutableDictionary dictionary];
}
return self;
}
- (id)initWithCursorDictionary:(NSDictionary *)dict ofVersion:(CGFloat)version {
if ((self = [self init])) {
if (![self _readFromDictionary:dict ofVersion:version])
return nil;
}
return self;
}
- (id)copyWithZone:(NSZone *)zone {
MCCursor *cursor = [[MCCursor allocWithZone:zone] init];
cursor.frameCount = self.frameCount;
cursor.frameDuration = self.frameDuration;
cursor.size = self.size;
cursor.representations = self.representations.mutableCopy;
cursor.hotSpot = self.hotSpot;
cursor.identifier = self.identifier;
return cursor;
}
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"imageWithAllReps"]) {
keyPaths = [keyPaths setByAddingObjectsFromArray:@[ @"representations" ]];
} else if ([key isEqualToString:@"name"]) {
keyPaths = [keyPaths setByAddingObjectsFromArray:@[ @"identifier" ]];
} else if ([key hasPrefix:@"cursorImage"]) {
keyPaths = [keyPaths setByAddingObjectsFromArray:@[ [key stringByReplacingCharactersInRange:NSMakeRange(6, 5) withString:@"Rep"] ]];
}
return keyPaths;
}
- (BOOL)_readFromDictionary:(NSDictionary *)dictionary ofVersion:(CGFloat)version {
if (!dictionary || !dictionary.count)
return NO;
NSNumber *frameCount = [dictionary objectForKey:MCCursorDictionaryFrameCountKey];
NSNumber *frameDuration = [dictionary objectForKey:MCCursorDictionaryFrameDuratiomKey];
// NSNumber *repeatCount = dictionary[MCCursorDictionaryRepeatCountKey];
NSNumber *hotSpotX = [dictionary objectForKey:MCCursorDictionaryHotSpotXKey];
NSNumber *hotSpotY = [dictionary objectForKey:MCCursorDictionaryHotSpotYKey];
NSNumber *pointsWide = [dictionary objectForKey:MCCursorDictionaryPointsWideKey];
NSNumber *pointsHigh = [dictionary objectForKey:MCCursorDictionaryPointsHighKey];
NSArray *reps = [dictionary objectForKey:MCCursorDictionaryRepresentationsKey];
// we only take version 2.0 documents.
if (version >= 2.0) {
if (frameCount && frameDuration && hotSpotX && hotSpotY && pointsWide && pointsHigh) {
self.frameCount = frameCount.unsignedIntegerValue;
self.frameDuration = frameDuration.doubleValue;
self.hotSpot = NSMakePoint(hotSpotX.doubleValue, hotSpotY.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);
// PNGCodec ignores colorspace information. As an invariant to our cape files we make sure
// all images are converted to sRGB so we retag it beforehand
[self setRepresentation:rep.retaggedSRGBSpace forScale:cursorScaleForScale(rep.pixelsWide / pointsWide.doubleValue)];
}
self.size = NSMakeSize(pointsWide.doubleValue, pointsHigh.doubleValue);
return YES;
}
}
return NO;
}
- (NSDictionary *)dictionaryRepresentation {
NSMutableDictionary *drep = [NSMutableDictionary dictionary];
drep[MCCursorDictionaryFrameCountKey] = @(self.frameCount);
drep[MCCursorDictionaryFrameDuratiomKey] = @(self.frameDuration);
drep[MCCursorDictionaryHotSpotXKey] = @(self.hotSpot.x);
drep[MCCursorDictionaryHotSpotYKey] = @(self.hotSpot.y);
drep[MCCursorDictionaryPointsWideKey] = @(self.size.width);
drep[MCCursorDictionaryPointsHighKey] = @(self.size.height);
NSMutableArray *pngs = [NSMutableArray array];
for (NSString *key in self.representations) {
NSBitmapImageRep *rep = self.representations[key];
pngs[pngs.count] = [rep.ensuredSRGBSpace representationUsingType:NSPNGFileType properties:@{}];
}
drep[MCCursorDictionaryRepresentationsKey] = pngs;
return drep;
}
- (id)valueForUndefinedKey:(NSString *)key {
// Special KVC for observers to be able to watch each scale
if ([key hasPrefix:@"cursorRep"] || [key hasPrefix:@"cursorImage"]) {
NSString *prefix = [key hasPrefix:@"cursorRep"] ? @"cursorRep" : @"cursorImage";
NSString *scaleString = [key substringFromIndex:prefix.length];
CGFloat scale = [scaleString doubleValue] / 100;
if ([key hasPrefix:@"cursorRep"])
return [self representationForScale:cursorScaleForScale(scale)];
else {
NSImageRep *rep = [self representationForScale:cursorScaleForScale(scale)];
if (rep) {
NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(rep.pixelsWide / scale, rep.pixelsHigh / scale)];
[image addRepresentation:rep];
return image;
}
return nil;
}
}
return [super valueForUndefinedKey:key];
}
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
// Special KVC for observers to be able to watch each scale
if ([key hasPrefix:@"cursorRep"] || [key hasPrefix:@"cursorImage"]) {
NSString *prefix = [key hasPrefix:@"cursorRep"] ? @"cursorRep" : @"cursorImage";
NSString *scaleString = [key substringFromIndex:prefix.length];
CGFloat scale = [scaleString doubleValue] / 100;
if ([key hasPrefix:@"cursorImage"]) {
value = [(NSImage *)value representations][0];
}
[self setRepresentation:value forScale:cursorScaleForScale(scale)];
return;
}
[super setValue:value forUndefinedKey:key];
}
- (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:[NSString stringWithFormat:@"%lu", (unsigned long)scale, nil]];
else
[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];
}
- (NSImageRep *)representationForScale:(MCCursorScale)scale {
return self.representations[[NSString stringWithFormat:@"%lu", (unsigned long)scale, nil]];
}
- (NSImageRep *)representationWithScale:(CGFloat)scale {
return [self representationForScale:cursorScaleForScale(scale)];
}
- (NSImage *)imageWithAllReps {
NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(self.size.width, self.size.height * self.frameCount)];
[image addRepresentations:self.representations.allValues];
return image;
}
- (NSString *)name {
return nameForCursorIdentifier(self.identifier);
}
- (BOOL)isEqualTo:(MCCursor *)object {
if (![object isKindOfClass:self.class]) {
return NO;
}
BOOL props = (object.frameCount == self.frameCount &&
object.frameDuration == self.frameDuration &&
NSEqualSizes(object.size, self.size) &&
NSEqualPoints(object.hotSpot, self.hotSpot) &&
[object.identifier isEqualToString:self.identifier]);
// props = (props && [self.representations isEqualToDictionary:object.representations]);
return props;
}
- (BOOL)isEqual:(id)object {
return [self isEqualTo:object];
}
@end

Some files were not shown because too many files have changed in this diff Show More