Printing, fixed layout, distribution, sped up loading, loading indicator

This commit is contained in:
Kilian Hofmann 2017-06-17 22:23:43 +02:00
parent 5d297dbebd
commit 03e30b9621
14 changed files with 298 additions and 60 deletions

View File

@ -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 */
};

View File

@ -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>

View File

@ -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
}
}
}

View File

@ -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>

View File

@ -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()
}
}

View File

@ -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()
}
}

View File

@ -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
}
}

View File

@ -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>

View 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
}
}

View 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>

View File

@ -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>

View File

@ -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)
}
}
}

View File

@ -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>

View File

@ -1,2 +1,2 @@
version 2.0
build 216
build 297