Distribution Pie charts implemented

This commit is contained in:
Kilian Hofmann 2017-06-16 22:35:01 +02:00
parent 8576e956d6
commit 095e1a8fd1
8 changed files with 122 additions and 117 deletions

View File

@ -28,6 +28,8 @@
E2218D5E1EF3DD6F004298F6 /* CollectionViewItemMonth.xib in Resources */ = {isa = PBXBuildFile; fileRef = E2218D5C1EF3DD6F004298F6 /* CollectionViewItemMonth.xib */; };
E2218D601EF40E23004298F6 /* CollectionViewYear.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2218D5F1EF40E23004298F6 /* CollectionViewYear.swift */; };
E2218D621EF41415004298F6 /* CollectionViewMonth.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2218D611EF41415004298F6 /* CollectionViewMonth.swift */; };
E2218D641EF45F37004298F6 /* LossDistributionPie.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2218D631EF45F37004298F6 /* LossDistributionPie.swift */; };
E2218D671EF463B4004298F6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2218D661EF463B4004298F6 /* QuartzCore.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -79,6 +81,8 @@
E2218D5C1EF3DD6F004298F6 /* CollectionViewItemMonth.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CollectionViewItemMonth.xib; sourceTree = "<group>"; };
E2218D5F1EF40E23004298F6 /* CollectionViewYear.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewYear.swift; sourceTree = "<group>"; };
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; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -93,6 +97,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E2218D671EF463B4004298F6 /* QuartzCore.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -106,6 +111,7 @@
E2218C991EF2D345004298F6 /* Logger4 */,
E2218D2A1EF3271F004298F6 /* Graphic Analysis 2 */,
E2218C831EF2D2B5004298F6 /* Products */,
E2218D651EF463B4004298F6 /* Frameworks */,
);
sourceTree = "<group>";
};
@ -277,16 +283,33 @@
sourceTree = "<group>";
};
E2218D501EF329D0004298F6 /* Views */ = {
isa = PBXGroup;
children = (
E2218D681EF46ED3004298F6 /* Collection View */,
E2218D2F1EF3271F004298F6 /* Document.swift */,
E2218D511EF32AC6004298F6 /* GraphDetailsController.swift */,
E2218D631EF45F37004298F6 /* LossDistributionPie.swift */,
);
name = Views;
sourceTree = "<group>";
};
E2218D651EF463B4004298F6 /* Frameworks */ = {
isa = PBXGroup;
children = (
E2218D661EF463B4004298F6 /* QuartzCore.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
E2218D681EF46ED3004298F6 /* Collection View */ = {
isa = PBXGroup;
children = (
E2218D611EF41415004298F6 /* CollectionViewMonth.swift */,
E2218D5F1EF40E23004298F6 /* CollectionViewYear.swift */,
E2218D5B1EF3DD6F004298F6 /* CollectionViewItemMonth.swift */,
E2218D551EF335E6004298F6 /* CollectionViewItemYear.swift */,
E2218D2F1EF3271F004298F6 /* Document.swift */,
E2218D511EF32AC6004298F6 /* GraphDetailsController.swift */,
);
name = Views;
name = "Collection View";
sourceTree = "<group>";
};
/* End PBXGroup section */
@ -459,6 +482,7 @@
E2218D2C1EF3271F004298F6 /* AppDelegate.swift in Sources */,
E2218D621EF41415004298F6 /* CollectionViewMonth.swift in Sources */,
E2218D601EF40E23004298F6 /* CollectionViewYear.swift in Sources */,
E2218D641EF45F37004298F6 /* LossDistributionPie.swift in Sources */,
E2218D571EF335E6004298F6 /* CollectionViewItemYear.swift in Sources */,
E2218D521EF32AC6004298F6 /* GraphDetailsController.swift in Sources */,
E2218D5D1EF3DD6F004298F6 /* CollectionViewItemMonth.swift in Sources */,

View File

@ -2,102 +2,4 @@
<Bucket
type = "1"
version = "2.0">
<Breakpoints>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Graphic Analysis 2/CollectionViewYear.swift"
timestampString = "519328313.206557"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "53"
endingLineNumber = "53"
landmarkName = "CollectionViewYear"
landmarkType = "4">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Graphic Analysis 2/CollectionViewYear.swift"
timestampString = "519328313.206557"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "54"
endingLineNumber = "54"
landmarkName = "collectionView(_:didSelectItemsAt:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Graphic Analysis 2/CollectionViewYear.swift"
timestampString = "519328313.206557"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "34"
endingLineNumber = "34"
landmarkName = "collectionView(_:itemForRepresentedObjectAt:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Graphic Analysis 2/Document.swift"
timestampString = "519325692.813512"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "41"
endingLineNumber = "41"
landmarkName = "read(from:ofType:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Graphic Analysis 2/Document.swift"
timestampString = "519325727.791633"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "46"
endingLineNumber = "46"
landmarkName = "read(from:ofType:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Graphic Analysis 2/Document.swift"
timestampString = "519325744.014708"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "48"
endingLineNumber = "48"
landmarkName = "read(from:ofType:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints>
</Bucket>

View File

@ -12,6 +12,10 @@ class CollectionViewItemMonth: NSCollectionViewItem {
@IBOutlet var day: NSTextField!
@IBOutlet var loss: NSTextField!
@IBOutlet var distributionAM: LossDistributionPie!
@IBOutlet var distributionPM: LossDistributionPie!
var distribution: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
@ -21,4 +25,21 @@ class CollectionViewItemMonth: NSCollectionViewItem {
view.layer?.borderWidth = 1.0
view.layer?.borderColor = NSColor.clear.cgColor
}
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 {
let hour: Int = Int(entry.components(separatedBy: ":")[0])!
if hour < 12 {
am[hour] += 1
} else {
pm[hour - 12] += 1
}
}
distributionAM.distribution = am
distributionPM.distribution = pm
distributionAM.needsDisplay = true
distributionPM.needsDisplay = true
}
}

View File

@ -8,6 +8,10 @@
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="CollectionViewItemMonth" customModule="Graphic_Analysis_2" customModuleProvider="target">
<connections>
<outlet property="day" destination="3aE-Wf-9eZ" id="T7k-f7-IBu"/>
<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="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
</connections>
</customObject>
@ -18,25 +22,16 @@
<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="92" width="24" height="20"/>
<rect key="frame" x="18" y="90" 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="16"/>
<font key="font" metaFont="system" size="17"/>
<color key="textColor" name="controlShadowColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bOH-fN-p3a">
<rect key="frame" x="18" y="67" width="36" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Loss:" id="6Hu-ZO-t9e">
<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>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ios-8D-sSB">
<rect key="frame" x="58" y="67" width="59" height="17"/>
<rect key="frame" x="58" y="65" width="59" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" id="axa-F2-XeS">
<font key="font" metaFont="system"/>
@ -44,12 +39,31 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bOH-fN-p3a">
<rect key="frame" x="18" y="65" width="36" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Loss:" id="6Hu-ZO-t9e">
<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>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="B0U-sm-QBD" customClass="LossDistributionPie" customModule="Graphic_Analysis_2" customModuleProvider="target">
<rect key="frame" x="20" y="20" width="37" height="37"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ftO-kx-Le5" customClass="LossDistributionPie" customModule="Graphic_Analysis_2" customModuleProvider="target">
<rect key="frame" x="78" y="20" width="37" height="37"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
</subviews>
<point key="canvasLocation" x="138.5" y="169"/>
</customView>
<collectionViewItem id="0ws-De-Ut2" customClass="CollectionViewItemMonth" customModule="Graphic_Analysis_2" customModuleProvider="target">
<connections>
<outlet property="day" destination="3aE-Wf-9eZ" id="dB1-dQ-VPe"/>
<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="view" destination="Hz6-mo-xeY" id="pe3-pf-cYV"/>
</connections>

View File

@ -30,6 +30,8 @@ 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 }
item2.distribution = []
item2.redrawDistribution()
item2.loss.stringValue = ""
item2.day.textColor = NSColor.controlShadowColor
item2.day.stringValue = "\(indexPath.item + 1)"
@ -37,8 +39,11 @@ extension CollectionViewMonth: NSCollectionViewDataSource {
guard let day = days[month!][indexPath.item] else { return item2 }
item2.day.textColor = NSColor.black
guard let log = day.fileWrappers?["KDLog.txt"] else { return item2 }
guard let loss = (String(data: log.regularFileContents!, encoding: .utf8)?.components(separatedBy: "\n").count) else { return item2 }
item2.loss.stringValue = "\(loss)"
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()
return item2
}
}

View File

@ -44,7 +44,7 @@
<key>CFBundleShortVersionString</key>
<string>2.0</string>
<key>CFBundleVersion</key>
<string>157</string>
<string>208</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>

View File

@ -0,0 +1,39 @@
//
// LossDistributionPie.swift
// Graphic Analysis 2
//
// Created by Kilian Hofmann on 16.06.17.
// Copyright © 2017 Kilian Hofmann. All rights reserved.
//
import Cocoa
class LossDistributionPie: NSView {
var distribution: [Int] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
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)
}
}
}
}

View File

@ -1,2 +1,2 @@
version 2.0
build 157
build 208