Printing, fixed layout, distribution, sped up loading, loading indicator
This commit is contained in:
parent
5d297dbebd
commit
03e30b9621
@ -31,6 +31,8 @@
|
||||
E2218D641EF45F37004298F6 /* LossDistributionPie.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2218D631EF45F37004298F6 /* LossDistributionPie.swift */; };
|
||||
E2218D671EF463B4004298F6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2218D661EF463B4004298F6 /* QuartzCore.framework */; };
|
||||
E2218D691EF478C0004298F6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E2218CA81EF2D37B004298F6 /* Assets.xcassets */; };
|
||||
E262463E1EF55BCE00EAA4A6 /* GraphWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = E262463C1EF55BCE00EAA4A6 /* GraphWindow.swift */; };
|
||||
E262463F1EF55BCE00EAA4A6 /* GraphWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = E262463D1EF55BCE00EAA4A6 /* GraphWindow.xib */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@ -84,6 +86,8 @@
|
||||
E2218D611EF41415004298F6 /* CollectionViewMonth.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewMonth.swift; sourceTree = "<group>"; };
|
||||
E2218D631EF45F37004298F6 /* LossDistributionPie.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LossDistributionPie.swift; sourceTree = "<group>"; };
|
||||
E2218D661EF463B4004298F6 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
|
||||
E262463C1EF55BCE00EAA4A6 /* GraphWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphWindow.swift; sourceTree = "<group>"; };
|
||||
E262463D1EF55BCE00EAA4A6 /* GraphWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GraphWindow.xib; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -253,6 +257,7 @@
|
||||
E2218D561EF335E6004298F6 /* CollectionViewItemYear.xib */,
|
||||
E2218D531EF32BC4004298F6 /* Document.xib */,
|
||||
E2218D4B1EF329A6004298F6 /* GraphDetailsController.xib */,
|
||||
E262463D1EF55BCE00EAA4A6 /* GraphWindow.xib */,
|
||||
E2218D491EF32917004298F6 /* MainMenu.xib */,
|
||||
);
|
||||
name = UI;
|
||||
@ -289,6 +294,7 @@
|
||||
E2218D681EF46ED3004298F6 /* Collection View */,
|
||||
E2218D2F1EF3271F004298F6 /* Document.swift */,
|
||||
E2218D511EF32AC6004298F6 /* GraphDetailsController.swift */,
|
||||
E262463C1EF55BCE00EAA4A6 /* GraphWindow.swift */,
|
||||
E2218D631EF45F37004298F6 /* LossDistributionPie.swift */,
|
||||
);
|
||||
name = Views;
|
||||
@ -454,6 +460,7 @@
|
||||
files = (
|
||||
E2218D691EF478C0004298F6 /* Assets.xcassets in Resources */,
|
||||
E2218D5E1EF3DD6F004298F6 /* CollectionViewItemMonth.xib in Resources */,
|
||||
E262463F1EF55BCE00EAA4A6 /* GraphWindow.xib in Resources */,
|
||||
E2218D541EF32BC4004298F6 /* Document.xib in Resources */,
|
||||
E2218D3B1EF32764004298F6 /* Graph.icns in Resources */,
|
||||
E2218D4C1EF329A6004298F6 /* GraphDetailsController.xib in Resources */,
|
||||
@ -484,6 +491,7 @@
|
||||
E2218D2C1EF3271F004298F6 /* AppDelegate.swift in Sources */,
|
||||
E2218D621EF41415004298F6 /* CollectionViewMonth.swift in Sources */,
|
||||
E2218D601EF40E23004298F6 /* CollectionViewYear.swift in Sources */,
|
||||
E262463E1EF55BCE00EAA4A6 /* GraphWindow.swift in Sources */,
|
||||
E2218D641EF45F37004298F6 /* LossDistributionPie.swift in Sources */,
|
||||
E2218D571EF335E6004298F6 /* CollectionViewItemYear.swift in Sources */,
|
||||
E2218D521EF32AC6004298F6 /* GraphDetailsController.swift in Sources */,
|
||||
@ -554,6 +562,7 @@
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
SWIFT_DISABLE_SAFETY_CHECKS = NO;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
};
|
||||
name = Debug;
|
||||
@ -596,6 +605,7 @@
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_DISABLE_SAFETY_CHECKS = NO;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
};
|
||||
name = Release;
|
||||
@ -674,6 +684,7 @@
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.weebly.alikja.Graphic-Analysis-2";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SWIFT_DISABLE_SAFETY_CHECKS = NO;
|
||||
SWIFT_VERSION = 3.0;
|
||||
};
|
||||
name = Debug;
|
||||
@ -690,6 +701,8 @@
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.weebly.alikja.Graphic-Analysis-2";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SWIFT_DISABLE_SAFETY_CHECKS = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
SWIFT_VERSION = 3.0;
|
||||
};
|
||||
name = Release;
|
||||
@ -738,6 +751,7 @@
|
||||
E2218CA61EF2D345004298F6 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
E2218CE61EF2D577004298F6 /* Build configuration list for PBXLegacyTarget "Bump Logger4" */ = {
|
||||
isa = XCConfigurationList;
|
||||
@ -746,6 +760,7 @@
|
||||
E2218CE81EF2D577004298F6 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
E2218D371EF3271F004298F6 /* Build configuration list for PBXNativeTarget "Graphic Analysis 2" */ = {
|
||||
isa = XCConfigurationList;
|
||||
@ -754,6 +769,7 @@
|
||||
E2218D391EF3271F004298F6 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
E2218D3E1EF32803004298F6 /* Build configuration list for PBXLegacyTarget "Bump Graphic Analysis 2" */ = {
|
||||
isa = XCConfigurationList;
|
||||
@ -762,6 +778,7 @@
|
||||
E2218D401EF32803004298F6 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
|
||||
@ -61,6 +61,13 @@
|
||||
ReferencedContainer = "container:Docsis Toolkit.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<EnvironmentVariables>
|
||||
<EnvironmentVariable
|
||||
key = "CA_DEBUG_TRANSACTIONS"
|
||||
value = "1"
|
||||
isEnabled = "YES">
|
||||
</EnvironmentVariable>
|
||||
</EnvironmentVariables>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
|
||||
@ -14,8 +14,11 @@ class CollectionViewItemMonth: NSCollectionViewItem {
|
||||
@IBOutlet var loss: NSTextField!
|
||||
@IBOutlet var distributionAM: LossDistributionPie!
|
||||
@IBOutlet var distributionPM: LossDistributionPie!
|
||||
@IBOutlet var month: NSTextField!
|
||||
|
||||
var distribution: [String] = []
|
||||
var graph: GraphWindow? = nil
|
||||
var dayFW: FileWrapper? = nil
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
@ -24,12 +27,22 @@ class CollectionViewItemMonth: NSCollectionViewItem {
|
||||
view.layer?.masksToBounds = true
|
||||
view.layer?.borderWidth = 1.0
|
||||
view.layer?.borderColor = NSColor.clear.cgColor
|
||||
graph = GraphWindow(collectionViewItem: self)
|
||||
}
|
||||
|
||||
func redrawDistribution() {
|
||||
func clearDistribution() {
|
||||
let am: [Int] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||
let pm: [Int] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||
distributionAM.distribution = am
|
||||
distributionPM.distribution = pm
|
||||
self.distributionAM.needsDisplay = true
|
||||
self.distributionPM.needsDisplay = true
|
||||
}
|
||||
|
||||
func redrawDistribution() {
|
||||
var am: [Int] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||
var pm: [Int] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||
for entry in distribution {
|
||||
for entry in self.distribution {
|
||||
let hour: Int = Int(entry.components(separatedBy: ":")[0])!
|
||||
if hour < 12 {
|
||||
am[hour] += 1
|
||||
@ -37,9 +50,11 @@ class CollectionViewItemMonth: NSCollectionViewItem {
|
||||
pm[hour - 12] += 1
|
||||
}
|
||||
}
|
||||
distributionAM.distribution = am
|
||||
distributionPM.distribution = pm
|
||||
distributionAM.needsDisplay = true
|
||||
distributionPM.needsDisplay = true
|
||||
self.distributionAM.distribution = am
|
||||
self.distributionPM.distribution = pm
|
||||
OperationQueue.main.addOperation {
|
||||
self.distributionAM.needsDisplay = true
|
||||
self.distributionPM.needsDisplay = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,6 +12,7 @@
|
||||
<outlet property="distributionAM" destination="B0U-sm-QBD" id="jN5-fA-i8W"/>
|
||||
<outlet property="distributionPM" destination="ftO-kx-Le5" id="Fjl-OH-3tS"/>
|
||||
<outlet property="loss" destination="Ios-8D-sSB" id="RS0-0q-8Bt"/>
|
||||
<outlet property="month" destination="4zV-3k-nlC" id="zax-kO-7tP"/>
|
||||
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
@ -22,7 +23,7 @@
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3aE-Wf-9eZ">
|
||||
<rect key="frame" x="18" y="100" width="26" height="22"/>
|
||||
<rect key="frame" x="91" y="100" width="26" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="01" id="hZ1-E9-nbm">
|
||||
<font key="font" metaFont="system" size="17"/>
|
||||
@ -74,6 +75,15 @@
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4zV-3k-nlC">
|
||||
<rect key="frame" x="18" y="100" width="73" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" id="3oV-8s-WLv">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</subviews>
|
||||
<point key="canvasLocation" x="138.5" y="169"/>
|
||||
</customView>
|
||||
@ -83,6 +93,7 @@
|
||||
<outlet property="distributionAM" destination="B0U-sm-QBD" id="PYF-qG-EVI"/>
|
||||
<outlet property="distributionPM" destination="ftO-kx-Le5" id="qra-Kr-uWo"/>
|
||||
<outlet property="loss" destination="Ios-8D-sSB" id="Pkz-fU-9Hd"/>
|
||||
<outlet property="month" destination="4zV-3k-nlC" id="fbD-pK-bEg"/>
|
||||
<outlet property="view" destination="Hz6-mo-xeY" id="pe3-pf-cYV"/>
|
||||
</connections>
|
||||
</collectionViewItem>
|
||||
|
||||
@ -11,14 +11,19 @@ import Cocoa
|
||||
class CollectionViewMonth: NSObject {
|
||||
var days: [[FileWrapper?]] = []
|
||||
var month: Int? = nil
|
||||
let monthNames: [String] = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
|
||||
let operationQueue: OperationQueue = OperationQueue()
|
||||
var doc: Document!
|
||||
|
||||
override init() {
|
||||
super.init()
|
||||
operationQueue.maxConcurrentOperationCount = 10
|
||||
}
|
||||
|
||||
init(days: [[FileWrapper?]]) {
|
||||
init(days: [[FileWrapper?]], document: Document) {
|
||||
super.init()
|
||||
self.days = days
|
||||
doc = document
|
||||
}
|
||||
}
|
||||
|
||||
@ -29,34 +34,69 @@ extension CollectionViewMonth: NSCollectionViewDataSource {
|
||||
|
||||
func collectionView(_ itemForRepresentedObjectAtcollectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
|
||||
let item = itemForRepresentedObjectAtcollectionView.makeItem(withIdentifier: "CollectionViewItemMonth", for: indexPath)
|
||||
guard let item2 = item as? CollectionViewItemMonth else { return item }
|
||||
guard let item2 = item as? CollectionViewItemMonth else {
|
||||
self.doc.progress.increment(by: 100/31)
|
||||
return item
|
||||
}
|
||||
if item2.isSelected {
|
||||
item2.view.layer?.borderColor = NSColor.gray.cgColor
|
||||
} else {
|
||||
item2.view.layer?.borderColor = NSColor.clear.cgColor
|
||||
item2.graph?.close()
|
||||
}
|
||||
item2.distribution = []
|
||||
item2.redrawDistribution()
|
||||
let op: OperationQueue = OperationQueue()
|
||||
op.maxConcurrentOperationCount = 1
|
||||
item2.clearDistribution()
|
||||
item2.loss.stringValue = ""
|
||||
item2.day.textColor = NSColor.controlShadowColor
|
||||
item2.day.stringValue = "\(indexPath.item + 1)"
|
||||
guard month != nil else { return item2 }
|
||||
guard let day = days[month!][indexPath.item] else { return item2 }
|
||||
guard month != nil else {
|
||||
self.doc.progress.increment(by: 100/31)
|
||||
return item2
|
||||
}
|
||||
if indexPath.item == 0 {
|
||||
item2.month.stringValue = monthNames[month!]
|
||||
} else {
|
||||
item2.month.stringValue = ""
|
||||
}
|
||||
guard let day = days[month!][indexPath.item] else {
|
||||
self.doc.progress.increment(by: 100/31)
|
||||
return item2
|
||||
}
|
||||
item2.day.textColor = NSColor.black
|
||||
guard let log = day.fileWrappers?["KDLog.txt"] else { return item2 }
|
||||
guard var logA = String(data: log.regularFileContents!, encoding: .utf8)?.components(separatedBy: "\n") else { return item2 }
|
||||
logA.removeLast()
|
||||
item2.loss.stringValue = "\(logA.count)"
|
||||
item2.distribution = logA
|
||||
item2.redrawDistribution()
|
||||
operationQueue.addOperation {
|
||||
guard let log = day.fileWrappers?["KDLog.txt"] else {
|
||||
OperationQueue.main.addOperation {
|
||||
self.doc.progress.increment(by: 100/31)
|
||||
}
|
||||
return
|
||||
}
|
||||
guard var logA = String(data: log.regularFileContents!, encoding: .utf8)?.components(separatedBy: "\n") else { return }
|
||||
logA.removeLast()
|
||||
item2.distribution = logA
|
||||
OperationQueue.main.addOperation {
|
||||
item2.loss.stringValue = "\(logA.count)"
|
||||
item2.redrawDistribution()
|
||||
self.doc.progress.increment(by: 100/31)
|
||||
}
|
||||
}
|
||||
item2.dayFW = day
|
||||
return item2
|
||||
}
|
||||
}
|
||||
|
||||
extension CollectionViewMonth : NSCollectionViewDelegate {
|
||||
func collectionView(_ collectionView: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {
|
||||
guard let layer = (collectionView.item(at: indexPaths.first!) as? CollectionViewItemMonth)?.view.layer else { return }
|
||||
layer.borderColor = NSColor.gray.cgColor
|
||||
guard let item = (collectionView.item(at: indexPaths.first!) as? CollectionViewItemMonth) else { return }
|
||||
item.view.layer?.borderColor = NSColor.gray.cgColor
|
||||
item.graph?.showWindow(self)
|
||||
}
|
||||
|
||||
func collectionView(_ collectionView: NSCollectionView, didDeselectItemsAt indexPaths: Set<IndexPath>) {
|
||||
guard let layer = (collectionView.item(at: indexPaths.first!) as? CollectionViewItemMonth)?.view.layer else { return }
|
||||
layer.borderColor = NSColor.clear.cgColor
|
||||
guard let item = (collectionView.item(at: indexPaths.first!) as? CollectionViewItemMonth) else { return }
|
||||
item.view.layer?.borderColor = NSColor.clear.cgColor
|
||||
item.graph?.close()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -13,16 +13,18 @@ class CollectionViewYear: NSObject {
|
||||
var dsMonth: CollectionViewMonth = CollectionViewMonth()
|
||||
var cvMonth: NSCollectionView = NSCollectionView()
|
||||
let monthNames: [String] = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
|
||||
var doc: Document!
|
||||
|
||||
override init() {
|
||||
super.init()
|
||||
}
|
||||
|
||||
init(months: [FileWrapper?], dataSourceMonth: CollectionViewMonth, collectionViewMonth: NSCollectionView) {
|
||||
init(months: [FileWrapper?], dataSourceMonth: CollectionViewMonth, collectionViewMonth: NSCollectionView, document: Document) {
|
||||
super.init()
|
||||
self.months = months
|
||||
self.dsMonth = dataSourceMonth
|
||||
self.cvMonth = collectionViewMonth
|
||||
doc = document
|
||||
}
|
||||
}
|
||||
|
||||
@ -54,11 +56,15 @@ extension CollectionViewYear : NSCollectionViewDelegate {
|
||||
func collectionView(_ collectionView: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {
|
||||
(collectionView.item(at: indexPaths.first!) as! CollectionViewItemYear).view.layer?.borderColor = NSColor.gray.cgColor
|
||||
dsMonth.month = indexPaths.first?.item
|
||||
cvMonth.reloadData()
|
||||
doc.progress.doubleValue = 0
|
||||
self.cvMonth.reloadData()
|
||||
}
|
||||
|
||||
func collectionView(_ collectionView: NSCollectionView, didDeselectItemsAt indexPaths: Set<IndexPath>) {
|
||||
guard let layer = (collectionView.item(at: indexPaths.first!) as? CollectionViewItemYear)?.view.layer else { return }
|
||||
layer.borderColor = NSColor.clear.cgColor
|
||||
dsMonth.month = nil
|
||||
doc.progress.doubleValue = 0
|
||||
self.cvMonth.reloadData()
|
||||
}
|
||||
}
|
||||
|
||||
@ -15,9 +15,11 @@ class Document: NSDocument {
|
||||
var days: [[FileWrapper?]] = []
|
||||
var yearDatasource: CollectionViewYear = CollectionViewYear()
|
||||
var monthDatasource: CollectionViewMonth = CollectionViewMonth()
|
||||
var windowController: NSWindowController = NSWindowController()
|
||||
|
||||
@IBOutlet var collectionViewYear: NSCollectionView!
|
||||
@IBOutlet var collectionViewMonth: NSCollectionView!
|
||||
@IBOutlet var progress: NSProgressIndicator!
|
||||
|
||||
override init() {
|
||||
super.init()
|
||||
@ -67,9 +69,10 @@ class Document: NSDocument {
|
||||
collectionViewMonth.collectionViewLayout = flowLayout2
|
||||
// Performance
|
||||
windowController.window?.contentView?.wantsLayer = true
|
||||
self.windowController = windowController
|
||||
// Data sources and delegate
|
||||
monthDatasource = CollectionViewMonth(days: days)
|
||||
yearDatasource = CollectionViewYear(months: months, dataSourceMonth: monthDatasource, collectionViewMonth: collectionViewMonth)
|
||||
monthDatasource = CollectionViewMonth(days: days, document: self)
|
||||
yearDatasource = CollectionViewYear(months: months, dataSourceMonth: monthDatasource, collectionViewMonth: collectionViewMonth, document: self)
|
||||
collectionViewYear.dataSource = yearDatasource
|
||||
collectionViewYear.delegate = yearDatasource
|
||||
collectionViewMonth.dataSource = monthDatasource
|
||||
@ -79,5 +82,17 @@ class Document: NSDocument {
|
||||
override func shouldCloseWindowController(_ windowController: NSWindowController, delegate: Any?, shouldClose shouldCloseSelector: Selector?, contextInfo: UnsafeMutableRawPointer?) {
|
||||
super.shouldCloseWindowController(windowController, delegate: delegate, shouldClose: shouldCloseSelector, contextInfo: contextInfo)
|
||||
}
|
||||
|
||||
override func printOperation(withSettings printSettings: [String : Any]) throws -> NSPrintOperation {
|
||||
let printOperation: NSPrintOperation = NSPrintOperation(view: collectionViewMonth)
|
||||
printOperation.printInfo.orientation = .landscape
|
||||
printOperation.printInfo.horizontalPagination = .fitPagination
|
||||
printOperation.printInfo.verticalPagination = .fitPagination
|
||||
printOperation.printInfo.topMargin = 1
|
||||
printOperation.printInfo.rightMargin = 1
|
||||
printOperation.printInfo.bottomMargin = 1
|
||||
printOperation.printInfo.leftMargin = 1
|
||||
return printOperation
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
<connections>
|
||||
<outlet property="collectionViewMonth" destination="hax-ty-I75" id="5UC-K2-fXz"/>
|
||||
<outlet property="collectionViewYear" destination="QrY-5g-8Dh" id="fP5-J7-IUa"/>
|
||||
<outlet property="progress" destination="PIE-RS-xuk" id="lvA-m1-yQd"/>
|
||||
<outlet property="window" destination="QvC-M9-y7g" id="rV3-WO-9Cg"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
@ -18,22 +19,21 @@
|
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" topStrut="YES"/>
|
||||
<rect key="contentRect" x="8" y="85" width="1272" height="715"/>
|
||||
<rect key="contentRect" x="8" y="85" width="1272" height="740"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="1280" height="800"/>
|
||||
<value key="minSize" type="size" width="1272" height="715"/>
|
||||
<value key="maxSize" type="size" width="1272" height="715"/>
|
||||
<value key="minSize" type="size" width="1272" height="740"/>
|
||||
<value key="maxSize" type="size" width="1272" height="740"/>
|
||||
<view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
|
||||
<rect key="frame" x="0.0" y="0.0" width="1272" height="715"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="1272" height="740"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<scrollView wantsLayer="YES" fixedFrame="YES" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="v0h-Ac-Zdb">
|
||||
<rect key="frame" x="20" y="20" width="964" height="675"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||
<clipView key="contentView" ambiguous="YES" drawsBackground="NO" id="mfx-sA-NT9">
|
||||
<scrollView wantsLayer="YES" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="v0h-Ac-Zdb">
|
||||
<rect key="frame" x="288" y="45" width="964" height="675"/>
|
||||
<clipView key="contentView" drawsBackground="NO" id="mfx-sA-NT9">
|
||||
<rect key="frame" x="1" y="1" width="962" height="673"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<collectionView identifier="month" ambiguous="YES" selectable="YES" id="hax-ty-I75">
|
||||
<collectionView identifier="month" selectable="YES" id="hax-ty-I75">
|
||||
<rect key="frame" x="0.0" y="0.0" width="962" height="673"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<collectionViewFlowLayout key="collectionViewLayout" minimumInteritemSpacing="10" minimumLineSpacing="10" id="Cyq-5W-OO3">
|
||||
@ -44,6 +44,10 @@
|
||||
</subviews>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</clipView>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="964" id="2Fd-F5-mfN"/>
|
||||
<constraint firstAttribute="height" constant="675" id="LH9-rK-flS"/>
|
||||
</constraints>
|
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="Ua0-m4-94V">
|
||||
<rect key="frame" x="-100" y="-100" width="960" height="16"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
@ -53,14 +57,13 @@
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
</scrollView>
|
||||
<scrollView wantsLayer="YES" fixedFrame="YES" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="p0d-ZT-icQ">
|
||||
<rect key="frame" x="1004" y="20" width="248" height="675"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||
<clipView key="contentView" ambiguous="YES" drawsBackground="NO" id="x8z-Ha-RAr">
|
||||
<scrollView wantsLayer="YES" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="p0d-ZT-icQ">
|
||||
<rect key="frame" x="20" y="45" width="248" height="675"/>
|
||||
<clipView key="contentView" drawsBackground="NO" id="x8z-Ha-RAr">
|
||||
<rect key="frame" x="1" y="1" width="246" height="673"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<collectionView identifier="year" ambiguous="YES" selectable="YES" id="QrY-5g-8Dh">
|
||||
<collectionView identifier="year" selectable="YES" id="QrY-5g-8Dh">
|
||||
<rect key="frame" x="0.0" y="0.0" width="246" height="673"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<collectionViewFlowLayout key="collectionViewLayout" minimumInteritemSpacing="10" minimumLineSpacing="10" id="y3w-79-aAH">
|
||||
@ -71,21 +74,59 @@
|
||||
</subviews>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</clipView>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="248" id="Cki-dW-UNn"/>
|
||||
<constraint firstAttribute="height" constant="675" id="diY-Fx-Rcz"/>
|
||||
</constraints>
|
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="B1S-Pw-6W0">
|
||||
<rect key="frame" x="1" y="143" width="225" height="16"/>
|
||||
<rect key="frame" x="1" y="-15" width="0.0" height="16"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="whY-aM-cDe">
|
||||
<rect key="frame" x="234" y="1" width="15" height="143"/>
|
||||
<rect key="frame" x="-15" y="1" width="16" height="0.0"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
</scrollView>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oGO-03-0dP">
|
||||
<rect key="frame" x="18" y="20" width="75" height="17"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="71" id="QkD-gW-Xgl"/>
|
||||
<constraint firstAttribute="height" constant="17" id="UGI-ar-Peh"/>
|
||||
</constraints>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Load status" id="E0E-Gb-jJx">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<progressIndicator wantsLayer="YES" maxValue="100" style="bar" translatesAutoresizingMaskIntoConstraints="NO" id="PIE-RS-xuk">
|
||||
<rect key="frame" x="99" y="18" width="169" height="20"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="18" id="IrB-lj-Z7z"/>
|
||||
<constraint firstAttribute="width" constant="169" id="LMw-fa-aeR"/>
|
||||
</constraints>
|
||||
</progressIndicator>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="oGO-03-0dP" firstAttribute="top" secondItem="p0d-ZT-icQ" secondAttribute="bottom" constant="8" id="6hn-jI-iDi"/>
|
||||
<constraint firstItem="v0h-Ac-Zdb" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="20" id="F4T-9q-adq"/>
|
||||
<constraint firstItem="oGO-03-0dP" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" id="F8l-8H-dTs"/>
|
||||
<constraint firstItem="PIE-RS-xuk" firstAttribute="top" secondItem="p0d-ZT-icQ" secondAttribute="bottom" constant="8" id="Gcz-ya-Sbm"/>
|
||||
<constraint firstItem="v0h-Ac-Zdb" firstAttribute="leading" secondItem="p0d-ZT-icQ" secondAttribute="trailing" constant="20" id="JgS-Ak-Rpe"/>
|
||||
<constraint firstItem="PIE-RS-xuk" firstAttribute="leading" secondItem="oGO-03-0dP" secondAttribute="trailing" constant="8" id="Mmr-Wj-C7s"/>
|
||||
<constraint firstAttribute="bottom" secondItem="oGO-03-0dP" secondAttribute="bottom" constant="20" id="WOw-So-ueQ"/>
|
||||
<constraint firstItem="PIE-RS-xuk" firstAttribute="leading" secondItem="oGO-03-0dP" secondAttribute="trailing" constant="8" id="fMn-4t-w1l"/>
|
||||
<constraint firstItem="p0d-ZT-icQ" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="20" id="g20-F3-eNh"/>
|
||||
<constraint firstAttribute="trailing" secondItem="v0h-Ac-Zdb" secondAttribute="trailing" constant="20" id="iae-HL-GFD"/>
|
||||
<constraint firstAttribute="bottom" secondItem="PIE-RS-xuk" secondAttribute="bottom" constant="19" id="u8N-0K-3Le"/>
|
||||
<constraint firstItem="p0d-ZT-icQ" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" id="uDO-bh-xfc"/>
|
||||
<constraint firstItem="v0h-Ac-Zdb" firstAttribute="leading" secondItem="p0d-ZT-icQ" secondAttribute="trailing" constant="20" id="wAi-4e-l44"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="-2" id="BPU-SZ-Fs4"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="224" y="60.5"/>
|
||||
<point key="canvasLocation" x="224" y="70.5"/>
|
||||
</window>
|
||||
</objects>
|
||||
</document>
|
||||
|
||||
40
Graphic Analysis 2/GraphWindow.swift
Normal file
40
Graphic Analysis 2/GraphWindow.swift
Normal file
@ -0,0 +1,40 @@
|
||||
//
|
||||
// GraphWindow.swift
|
||||
// Graphic Analysis 2
|
||||
//
|
||||
// Created by Kilian Hofmann on 17.06.17.
|
||||
// Copyright © 2017 Kilian Hofmann. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
|
||||
class GraphWindow: NSWindowController {
|
||||
|
||||
var collectionViewItem: CollectionViewItemMonth?
|
||||
|
||||
override var windowNibName: String! {
|
||||
return "GraphWindow"
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
super.init(coder: coder)
|
||||
}
|
||||
|
||||
init(collectionViewItem: CollectionViewItemMonth) {
|
||||
super.init(window: nil)
|
||||
self.collectionViewItem = collectionViewItem
|
||||
}
|
||||
|
||||
override func windowDidLoad() {
|
||||
super.windowDidLoad()
|
||||
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
|
||||
}
|
||||
}
|
||||
|
||||
extension GraphWindow: NSWindowDelegate {
|
||||
func windowShouldClose(_ sender: Any) -> Bool {
|
||||
collectionViewItem?.isSelected = false
|
||||
collectionViewItem?.view.layer?.borderColor = NSColor.clear.cgColor
|
||||
return true
|
||||
}
|
||||
}
|
||||
30
Graphic Analysis 2/GraphWindow.xib
Normal file
30
Graphic Analysis 2/GraphWindow.xib
Normal file
@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12121" systemVersion="16G16b" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="12121"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="GraphWindow" customModule="Graphic_Analysis_2" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||
<rect key="contentRect" x="196" y="240" width="480" height="270"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="1280" height="800"/>
|
||||
<view key="contentView" wantsLayer="YES" id="se5-gp-TjO">
|
||||
<rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
|
||||
</connections>
|
||||
</window>
|
||||
</objects>
|
||||
</document>
|
||||
@ -44,7 +44,7 @@
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>216</string>
|
||||
<string>297</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.utilities</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
|
||||
@ -17,22 +17,32 @@ class LossDistributionPie: NSView {
|
||||
let center: CGPoint = CGPoint(x: 18.5, y: 18.5)
|
||||
let startAngle: CGFloat = (1/2) * CGFloat.pi
|
||||
let increment: CGFloat = CGFloat.pi / 6
|
||||
|
||||
for i in 0..<12 {
|
||||
let layer: CAShapeLayer = CAShapeLayer()
|
||||
layer.fillColor = CGColor(red: 1, green: 0, blue: 0, alpha: CGFloat(distribution[i]) / 60)
|
||||
layer.strokeColor = NSColor.controlShadowColor.cgColor
|
||||
layer.lineWidth = 0.5
|
||||
layer.frame = dirtyRect
|
||||
let arc: CGMutablePath = CGMutablePath()
|
||||
arc.move(to: center)
|
||||
arc.addArc(center: center, radius: 18, startAngle: startAngle - CGFloat(i)*increment, endAngle: startAngle - CGFloat(i+1)*increment, clockwise: true)
|
||||
arc.closeSubpath()
|
||||
layer.path = arc
|
||||
if self.layer?.sublayers?.count == 12 {
|
||||
self.layer?.replaceSublayer((self.layer?.sublayers?[i])!, with: layer)
|
||||
} else{
|
||||
self.layer?.addSublayer(layer)
|
||||
if NSGraphicsContext.currentContextDrawingToScreen() {
|
||||
let layer: CAShapeLayer = CAShapeLayer()
|
||||
layer.fillColor = CGColor(red: 1, green: 0, blue: 0, alpha: CGFloat(distribution[i]) / 60)
|
||||
layer.strokeColor = NSColor.controlShadowColor.cgColor
|
||||
layer.lineWidth = 0.5
|
||||
layer.frame = dirtyRect
|
||||
let arc: CGMutablePath = CGMutablePath()
|
||||
arc.move(to: center)
|
||||
arc.addArc(center: center, radius: 18, startAngle: startAngle - CGFloat(i)*increment, endAngle: startAngle - CGFloat(i+1)*increment, clockwise: true)
|
||||
arc.closeSubpath()
|
||||
layer.path = arc
|
||||
if self.layer?.sublayers?.count == 12 {
|
||||
self.layer?.replaceSublayer((self.layer?.sublayers?[i])!, with: layer)
|
||||
} else{
|
||||
self.layer?.addSublayer(layer)
|
||||
}
|
||||
} else {
|
||||
let arc: CGMutablePath = CGMutablePath()
|
||||
arc.move(to: center)
|
||||
arc.addArc(center: center, radius: 18, startAngle: startAngle - CGFloat(i)*increment, endAngle: startAngle - CGFloat(i+1)*increment, clockwise: true)
|
||||
arc.closeSubpath()
|
||||
NSGraphicsContext.current()!.cgContext.addPath(arc)
|
||||
NSGraphicsContext.current()!.cgContext.setFillColor(CGColor(red: 1, green: 0, blue: 0, alpha: CGFloat(distribution[i]) / 60))
|
||||
NSGraphicsContext.current()!.cgContext.setStrokeColor(NSColor.controlShadowColor.cgColor)
|
||||
NSGraphicsContext.current()!.cgContext.drawPath(using: CGPathDrawingMode.fillStroke)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -81,6 +81,12 @@
|
||||
<action selector="performClose:" target="-1" id="cSP-dh-2sP"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="FZ5-XX-9Kk"/>
|
||||
<menuItem title="Print" keyEquivalent="p" id="Dv8-mM-MkR">
|
||||
<connections>
|
||||
<action selector="printDocument:" target="-1" id="0i5-gB-HXD"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
version 2.0
|
||||
build 216
|
||||
build 297
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user