4 Commits

Author SHA1 Message Date
macmade 7c741d0d38 1.1.0-27 2018-11-13 20:17:36 +01:00
macmade 9065c5db02 Log URLs are now retrieved and can be opened. 2018-11-13 20:07:30 +01:00
Jean-David Gadina 41c9af00a8 Merge pull request #1 from zmarouf/patch-1
Fix typo in the Readme...
2018-11-08 20:02:08 +01:00
Zeid Marouf a710f923e6 Fix typo in the Readme... 2018-11-08 13:20:27 +09:00
10 changed files with 304 additions and 104 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 503 KiB

After

Width:  |  Height:  |  Size: 514 KiB

+8 -8
View File
@@ -26,8 +26,8 @@
05D7472021924D1F002CF085 /* AboutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D7471F21924D1F002CF085 /* AboutWindowController.swift */; };
05E3745521925281000C6736 /* GitHubUpdates.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05E3745121925277000C6736 /* GitHubUpdates.framework */; };
05E3745921925294000C6736 /* GitHubUpdates.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 05E3745121925277000C6736 /* GitHubUpdates.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
05E3745B219253B5000C6736 /* ArrayIsEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05E3745A219253B5000C6736 /* ArrayIsEmpty.swift */; };
05E3745D2192545A000C6736 /* ArrayIsNotEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05E3745C2192545A000C6736 /* ArrayIsNotEmpty.swift */; };
05E3745B219253B5000C6736 /* IsEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05E3745A219253B5000C6736 /* IsEmpty.swift */; };
05E3745D2192545A000C6736 /* IsNotEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05E3745C2192545A000C6736 /* IsNotEmpty.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -130,8 +130,8 @@
05D7471D21924D18002CF085 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/Notarize.AboutWindowController.xib; sourceTree = "<group>"; };
05D7471F21924D1F002CF085 /* AboutWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutWindowController.swift; sourceTree = "<group>"; };
05E3744B21925276000C6736 /* GitHubUpdates.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GitHubUpdates.xcodeproj; path = Submodules/GitHubUpdates/GitHubUpdates.xcodeproj; sourceTree = "<group>"; };
05E3745A219253B5000C6736 /* ArrayIsEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrayIsEmpty.swift; sourceTree = "<group>"; };
05E3745C2192545A000C6736 /* ArrayIsNotEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrayIsNotEmpty.swift; sourceTree = "<group>"; };
05E3745A219253B5000C6736 /* IsEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IsEmpty.swift; sourceTree = "<group>"; };
05E3745C2192545A000C6736 /* IsNotEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IsNotEmpty.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -202,8 +202,8 @@
05D746B92191F0BB002CF085 /* Keychain.swift */,
059A0B60219050A3004E1D89 /* MainWindowController.swift */,
05D7469121919DE7002CF085 /* Preferences.swift */,
05E3745A219253B5000C6736 /* ArrayIsEmpty.swift */,
05E3745C2192545A000C6736 /* ArrayIsNotEmpty.swift */,
05E3745A219253B5000C6736 /* IsEmpty.swift */,
05E3745C2192545A000C6736 /* IsNotEmpty.swift */,
);
path = Classes;
sourceTree = "<group>";
@@ -475,14 +475,14 @@
05D7469421919F53002CF085 /* Account.swift in Sources */,
05D7472021924D1F002CF085 /* AboutWindowController.swift in Sources */,
059A0B61219050A3004E1D89 /* MainWindowController.swift in Sources */,
05E3745D2192545A000C6736 /* ArrayIsNotEmpty.swift in Sources */,
05E3745D2192545A000C6736 /* IsNotEmpty.swift in Sources */,
05D746E721923630002CF085 /* HistoryItem.swift in Sources */,
05D746E021922726002CF085 /* ALTool.swift in Sources */,
059A0B6921905534004E1D89 /* AccountWindowController.swift in Sources */,
05D7469221919DE7002CF085 /* Preferences.swift in Sources */,
059A0B5E2190504B004E1D89 /* ApplicationDelegate.swift in Sources */,
05D746BA2191F0BB002CF085 /* Keychain.swift in Sources */,
05E3745B219253B5000C6736 /* ArrayIsEmpty.swift in Sources */,
05E3745B219253B5000C6736 /* IsEmpty.swift in Sources */,
05D746E2219230FC002CF085 /* HistoryViewController.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
+14
View File
@@ -68,6 +68,20 @@ class ALTool
}
}
func notarizationInfo( for uuid: String ) throws -> String?
{
do
{
let out = try ALTool.run( arguments: [ "--notarization-info", uuid, "-u", self.username, "-p", self.password, "--output-format", "xml" ] )
return out.trimmingCharacters( in: NSCharacterSet.whitespacesAndNewlines )
}
catch let e as NSError
{
throw e
}
}
private class func run( arguments: [ String ] ) throws -> String
{
var args = [ "altool" ]
+21 -5
View File
@@ -26,11 +26,12 @@ import Cocoa
@objc class HistoryItem: NSObject
{
@objc public var date: NSDate
@objc public var uuid: String
@objc public var success: Bool
@objc public var status: Int
@objc public var message: String
@objc public dynamic var date: NSDate
@objc public dynamic var uuid: String
@objc public dynamic var success: Bool
@objc public dynamic var status: Int
@objc public dynamic var message: String
@objc public dynamic var logURL: String?
class func ItemsFromDictionary( dict: NSDictionary? ) -> [ HistoryItem ]
{
@@ -97,4 +98,19 @@ import Cocoa
self.status = code.intValue
self.message = message
}
override func isEqual( _ object: Any? ) -> Bool
{
guard let o = object as? HistoryItem else
{
return false
}
return self.uuid == o.uuid
}
override var hash: Int
{
return self.uuid.hash
}
}
+129 -16
View File
@@ -24,17 +24,19 @@
import Cocoa
class HistoryViewController: NSViewController
class HistoryViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource
{
@IBOutlet private var itemsController: NSArrayController!
@objc private dynamic var loading = true
@objc private dynamic var refreshing = false
@objc private dynamic var items = [ HistoryItem ]()
@objc private dynamic var loading = true
@objc private dynamic var refreshing = false
@objc private dynamic var gettingInfo = false
@objc private dynamic var items = Set< HistoryItem >()
private var account: Account?
private var timer: Timer?
private var add: AccountWindowController?
private var account: Account?
private var refreshTimer: Timer?
private var infoTimer: Timer?
private var add: AccountWindowController?
convenience init( account: Account )
{
@@ -45,7 +47,8 @@ class HistoryViewController: NSViewController
deinit
{
self.timer?.invalidate()
self.refreshTimer?.invalidate()
self.infoTimer?.invalidate()
}
override var nibName: NSNib.Name?
@@ -61,10 +64,15 @@ class HistoryViewController: NSViewController
self.refresh( nil )
self.timer = Timer.scheduledTimer( withTimeInterval: 5, repeats: true )
self.refreshTimer = Timer.scheduledTimer( withTimeInterval: 5, repeats: true )
{
t in self.refresh( userInitiated: false )
}
self.infoTimer = Timer.scheduledTimer( withTimeInterval: 5, repeats: true )
{
t in self.getInfo()
}
}
@IBAction func refresh( _ sender: Any? )
@@ -72,6 +80,21 @@ class HistoryViewController: NSViewController
self.refresh( userInitiated: true )
}
@IBAction func showInfo( _ sender: Any? )
{
guard let item = sender as? HistoryItem else
{
return
}
guard let url = URL( string: item.logURL ?? "" ) else
{
return
}
NSWorkspace.shared.open( url )
}
private func refresh( userInitiated: Bool )
{
DispatchQueue.main.async
@@ -111,20 +134,32 @@ class HistoryViewController: NSViewController
DispatchQueue.global( qos: .userInitiated ).async
{
let altool = ALTool( username: account.username, password: password )
let xml = try? altool.notarizationHistory()
let altool = ALTool( username: account.username, password: password )
let xml = try? altool.notarizationHistory()
DispatchQueue.main.async
if let xmlData = xml??.data( using: .utf8 )
{
if let xmlData = xml??.data( using: .utf8 )
if let history = try? PropertyListSerialization.propertyList( from: xmlData, options: [], format: nil ) as? NSDictionary
{
if let history = try? PropertyListSerialization.propertyList( from: xmlData, options: [], format: nil ) as? NSDictionary
let items = HistoryItem.ItemsFromDictionary( dict: history )
DispatchQueue.main.async
{
self.itemsController.remove( contentsOf: self.items )
self.itemsController.add( contentsOf: HistoryItem.ItemsFromDictionary( dict: history ) )
items.forEach
{
o in
if self.items.contains( o ) == false
{
self.items.insert( o )
}
}
}
}
}
DispatchQueue.main.async
{
self.loading = false
self.refreshing = false
}
@@ -132,6 +167,84 @@ class HistoryViewController: NSViewController
}
}
private func getInfo()
{
DispatchQueue.main.async
{
if self.gettingInfo
{
return
}
self.gettingInfo = true
DispatchQueue.global( qos: .userInitiated ).async
{
guard let account = self.account else
{
return
}
guard let password = account.password else
{
return
}
let items = DispatchQueue.main.sync { return self.items }
let altool = ALTool( username: account.username, password: password )
let group = DispatchGroup()
for item in items.filter( { o in o.logURL == nil } )
{
DispatchQueue.global( qos: .userInitiated ).async( group: group )
{
guard let xml = try? altool.notarizationInfo( for: item.uuid ) else
{
return
}
guard let xmlData = xml?.data( using: .utf8 ) else
{
return
}
guard let info = try? PropertyListSerialization.propertyList( from: xmlData, options: [], format: nil ) as? NSDictionary else
{
return
}
guard let plist = info else
{
return
}
guard let notarization = plist[ "notarization-info" ] as? NSDictionary else
{
return
}
guard let url = notarization[ "LogFileURL" ] as? String else
{
return
}
DispatchQueue.main.async
{
item.logURL = url
}
}
}
group.wait()
DispatchQueue.main.async
{
self.gettingInfo = false
}
}
}
}
private func askPassword()
{
if self.add != nil
@@ -1,7 +1,7 @@
/*******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2018 Jean-David Gadina - www.xs-labs.com
* Copyright (c) 2018 DigiDNA - www.imazing.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -24,25 +24,37 @@
import Cocoa
@objc public class ArrayIsEmpty: ValueTransformer
class IsEmpty: ValueTransformer
{
override public class func transformedValueClass() -> AnyClass
override class func transformedValueClass() -> AnyClass
{
return NSNumber.self
}
override public class func allowsReverseTransformation() -> Bool
override class func allowsReverseTransformation() -> Bool
{
return false
}
override public func transformedValue( _ value: Any? ) -> Any?
override func transformedValue( _ value: Any? ) -> Any?
{
guard let array = value as? NSArray else
if let array = value as? NSArray
{
return NSNumber( booleanLiteral: true )
return array.count == 0
}
else if let set = value as? NSSet
{
return set.count == 0
}
else if let dictionary = value as? NSDictionary
{
return dictionary.count == 0
}
else if let string = value as? String
{
return string.count == 0
}
return NSNumber( booleanLiteral: array.count == 0 )
return true
}
}
@@ -1,7 +1,7 @@
/*******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2018 Jean-David Gadina - www.xs-labs.com
* Copyright (c) 2018 DigiDNA - www.imazing.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -24,25 +24,37 @@
import Cocoa
@objc public class ArrayIsNotEmpty: ValueTransformer
class IsNotEmpty: ValueTransformer
{
override public class func transformedValueClass() -> AnyClass
override class func transformedValueClass() -> AnyClass
{
return NSNumber.self
}
override public class func allowsReverseTransformation() -> Bool
override class func allowsReverseTransformation() -> Bool
{
return false
}
override public func transformedValue( _ value: Any? ) -> Any?
override func transformedValue( _ value: Any? ) -> Any?
{
guard let array = value as? NSArray else
if let array = value as? NSArray
{
return NSNumber( booleanLiteral: false )
return array.count > 0
}
else if let set = value as? NSSet
{
return set.count > 0
}
else if let dictionary = value as? NSDictionary
{
return dictionary.count > 0
}
else if let string = value as? String
{
return string.count > 0
}
return NSNumber( booleanLiteral: array.count > 0 )
return false
}
}
+2 -2
View File
@@ -17,9 +17,9 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<string>1.1.0</string>
<key>CFBundleVersion</key>
<string>22</string>
<string>27</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>
@@ -49,6 +49,57 @@
</binding>
</connections>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="4gW-Wz-KbZ">
<rect key="frame" x="0.0" y="0.0" width="791" height="589"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3Np-5q-xRo">
<rect key="frame" x="287" y="443" width="217" height="36"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="No Data Available" id="WDl-1p-B7p">
<font key="font" metaFont="systemThin" size="30"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qKQ-Pd-1H7">
<rect key="frame" x="268" y="167" width="256" height="256"/>
<constraints>
<constraint firstAttribute="height" constant="256" id="EFm-8K-mFN"/>
<constraint firstAttribute="width" constant="256" id="dy3-Ix-Ru7"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" image="NSApplicationIcon" id="gLF-aJ-vlK"/>
</imageView>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4GV-g7-iLV">
<rect key="frame" x="342" y="119" width="107" height="32"/>
<buttonCell key="cell" type="push" title="Refresh" bezelStyle="rounded" image="NSRefreshFreestandingTemplate" imagePosition="leading" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8Xy-jP-dKA">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="refresh:" target="-2" id="wFY-oR-M6L"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="3Np-5q-xRo" firstAttribute="centerX" secondItem="qKQ-Pd-1H7" secondAttribute="centerX" id="FD2-jE-SGr"/>
<constraint firstItem="4GV-g7-iLV" firstAttribute="top" secondItem="qKQ-Pd-1H7" secondAttribute="bottom" constant="20" id="HSw-gS-95R"/>
<constraint firstItem="qKQ-Pd-1H7" firstAttribute="centerX" secondItem="4gW-Wz-KbZ" secondAttribute="centerX" id="JCY-w7-n0I"/>
<constraint firstItem="qKQ-Pd-1H7" firstAttribute="centerY" secondItem="4gW-Wz-KbZ" secondAttribute="centerY" id="Mgn-xM-4uG"/>
<constraint firstItem="qKQ-Pd-1H7" firstAttribute="top" secondItem="3Np-5q-xRo" secondAttribute="bottom" constant="20" id="aaw-ST-kxf"/>
<constraint firstItem="4GV-g7-iLV" firstAttribute="centerX" secondItem="qKQ-Pd-1H7" secondAttribute="centerX" id="vw9-CS-2lQ"/>
</constraints>
<connections>
<binding destination="-2" name="hidden" keyPath="loading" id="xYW-br-j0Z"/>
<binding destination="-2" name="hidden2" keyPath="self.items" previousBinding="xYW-br-j0Z" id="VTf-UQ-DhU">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">Notarize.IsNotEmpty</string>
</dictionary>
</binding>
</connections>
</customView>
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="32" horizontalPageScroll="10" verticalLineScroll="32" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YfE-Rw-vXm">
<rect key="frame" x="0.0" y="0.0" width="791" height="589"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="jMg-EM-3u0">
@@ -236,7 +287,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Htf-9O-HfB">
<rect key="frame" x="0.0" y="8" width="304" height="14"/>
<rect key="frame" x="0.0" y="8" width="270" height="14"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" sendsActionOnEndEditing="YES" title="Table View Cell" id="qAC-Pe-dzF">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -246,11 +297,41 @@
<binding destination="a0C-v9-jpd" name="value" keyPath="objectValue.message" id="imO-yf-BBq"/>
</connections>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="9LR-mA-ejX">
<rect key="frame" x="278" y="7" width="16" height="16"/>
<constraints>
<constraint firstAttribute="width" constant="16" id="oce-eh-do7"/>
<constraint firstAttribute="height" constant="16" id="pVl-48-3rY"/>
</constraints>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="NSQuickLookTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyUpOrDown" inset="2" id="6Rt-0Q-4Jj">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="a0C-v9-jpd" name="argument" keyPath="objectValue" id="SF1-A4-wnX">
<dictionary key="options">
<string key="NSSelectorName">showInfo:</string>
</dictionary>
</binding>
<binding destination="a0C-v9-jpd" name="hidden" keyPath="objectValue.logURL" id="QJW-MN-wYd">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
<binding destination="-2" name="target" keyPath="self" previousBinding="SF1-A4-wnX" id="CLU-f4-FB0">
<dictionary key="options">
<string key="NSSelectorName">showInfo:</string>
</dictionary>
</binding>
</connections>
</button>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="9LR-mA-ejX" secondAttribute="trailing" constant="10" id="3Iv-i9-wuK"/>
<constraint firstItem="9LR-mA-ejX" firstAttribute="centerY" secondItem="Htf-9O-HfB" secondAttribute="centerY" id="IAD-cp-5Xd"/>
<constraint firstItem="Htf-9O-HfB" firstAttribute="centerY" secondItem="a0C-v9-jpd" secondAttribute="centerY" id="KYd-sb-upO"/>
<constraint firstAttribute="trailing" secondItem="Htf-9O-HfB" secondAttribute="trailing" constant="2" id="NVl-PL-5ph"/>
<constraint firstItem="Htf-9O-HfB" firstAttribute="leading" secondItem="a0C-v9-jpd" secondAttribute="leading" constant="2" id="kM0-Oe-QY0"/>
<constraint firstItem="9LR-mA-ejX" firstAttribute="leading" secondItem="Htf-9O-HfB" secondAttribute="trailing" constant="10" id="x9i-0v-pM7"/>
</constraints>
<connections>
<outlet property="textField" destination="Htf-9O-HfB" id="smr-M1-6KR"/>
@@ -263,6 +344,8 @@
<binding destination="scX-MD-094" name="content" keyPath="arrangedObjects" id="o6w-dp-EnJ"/>
<binding destination="scX-MD-094" name="selectionIndexes" keyPath="selectionIndexes" previousBinding="o6w-dp-EnJ" id="cT6-ut-G5b"/>
<binding destination="scX-MD-094" name="sortDescriptors" keyPath="sortDescriptors" previousBinding="cT6-ut-G5b" id="LVB-12-aeT"/>
<outlet property="dataSource" destination="-2" id="9v3-Am-50G"/>
<outlet property="delegate" destination="-2" id="gkG-z5-vqD"/>
</connections>
</tableView>
</subviews>
@@ -281,68 +364,17 @@
</tableHeaderView>
<connections>
<binding destination="-2" name="hidden" keyPath="loading" id="DZt-gS-AT9"/>
<binding destination="-2" name="hidden2" keyPath="self.items" previousBinding="DZt-gS-AT9" id="7SZ-ux-Gh8">
<binding destination="-2" name="hidden2" keyPath="self.items" previousBinding="DZt-gS-AT9" id="lEZ-NG-lkf">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">Notarize.ArrayIsEmpty</string>
<string key="NSValueTransformerName">Notarize.IsEmpty</string>
</dictionary>
</binding>
</connections>
</scrollView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="4gW-Wz-KbZ">
<rect key="frame" x="0.0" y="0.0" width="791" height="589"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3Np-5q-xRo">
<rect key="frame" x="287" y="443" width="217" height="36"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="No Data Available" id="WDl-1p-B7p">
<font key="font" metaFont="systemThin" size="30"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qKQ-Pd-1H7">
<rect key="frame" x="268" y="167" width="256" height="256"/>
<constraints>
<constraint firstAttribute="height" constant="256" id="EFm-8K-mFN"/>
<constraint firstAttribute="width" constant="256" id="dy3-Ix-Ru7"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" image="NSApplicationIcon" id="gLF-aJ-vlK"/>
</imageView>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4GV-g7-iLV">
<rect key="frame" x="342" y="119" width="107" height="32"/>
<buttonCell key="cell" type="push" title="Refresh" bezelStyle="rounded" image="NSRefreshFreestandingTemplate" imagePosition="leading" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8Xy-jP-dKA">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="refresh:" target="-2" id="wFY-oR-M6L"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="3Np-5q-xRo" firstAttribute="centerX" secondItem="qKQ-Pd-1H7" secondAttribute="centerX" id="FD2-jE-SGr"/>
<constraint firstItem="4GV-g7-iLV" firstAttribute="top" secondItem="qKQ-Pd-1H7" secondAttribute="bottom" constant="20" id="HSw-gS-95R"/>
<constraint firstItem="qKQ-Pd-1H7" firstAttribute="centerX" secondItem="4gW-Wz-KbZ" secondAttribute="centerX" id="JCY-w7-n0I"/>
<constraint firstItem="qKQ-Pd-1H7" firstAttribute="centerY" secondItem="4gW-Wz-KbZ" secondAttribute="centerY" id="Mgn-xM-4uG"/>
<constraint firstItem="qKQ-Pd-1H7" firstAttribute="top" secondItem="3Np-5q-xRo" secondAttribute="bottom" constant="20" id="aaw-ST-kxf"/>
<constraint firstItem="4GV-g7-iLV" firstAttribute="centerX" secondItem="qKQ-Pd-1H7" secondAttribute="centerX" id="vw9-CS-2lQ"/>
</constraints>
<connections>
<binding destination="-2" name="hidden" keyPath="loading" id="xYW-br-j0Z"/>
<binding destination="-2" name="hidden2" keyPath="self.items" previousBinding="xYW-br-j0Z" id="P4I-Ea-MOw">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">Notarize.ArrayIsNotEmpty</string>
</dictionary>
</binding>
</connections>
</customView>
</subviews>
<constraints>
<constraint firstItem="YfE-Rw-vXm" firstAttribute="centerY" secondItem="c22-O7-iKe" secondAttribute="centerY" id="2AA-KP-qpA"/>
@@ -362,12 +394,13 @@
</customView>
<arrayController selectsInsertedObjects="NO" avoidsEmptySelection="NO" automaticallyRearrangesObjects="YES" id="scX-MD-094">
<connections>
<binding destination="-2" name="contentArray" keyPath="self.items" id="0Hr-36-gVJ"/>
<binding destination="-2" name="contentSet" keyPath="self.items" id="rB8-Xq-XDt"/>
</connections>
</arrayController>
</objects>
<resources>
<image name="NSApplicationIcon" width="128" height="128"/>
<image name="NSQuickLookTemplate" width="19" height="12"/>
<image name="NSRefreshFreestandingTemplate" width="14" height="14"/>
<image name="NSStatusAvailable" width="16" height="16"/>
<image name="NSStatusUnavailable" width="16" height="16"/>
+1 -1
View File
@@ -12,7 +12,7 @@ Notarize
### About
Notarization status monitoring tool for macOS, supprting multiple developer accounts.
Notarization status monitoring tool for macOS, supporting multiple developer accounts.
![Main Window](Assets/MainWindow.png "Main Window")