diff --git a/Docsis Toolkit.xcodeproj/project.pbxproj b/Docsis Toolkit.xcodeproj/project.pbxproj index 01b7fe3..396dbfb 100644 --- a/Docsis Toolkit.xcodeproj/project.pbxproj +++ b/Docsis Toolkit.xcodeproj/project.pbxproj @@ -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 = ""; }; E2218D5F1EF40E23004298F6 /* CollectionViewYear.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewYear.swift; sourceTree = ""; }; E2218D611EF41415004298F6 /* CollectionViewMonth.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewMonth.swift; sourceTree = ""; }; + E2218D631EF45F37004298F6 /* LossDistributionPie.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LossDistributionPie.swift; sourceTree = ""; }; + 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 = ""; }; @@ -277,16 +283,33 @@ sourceTree = ""; }; E2218D501EF329D0004298F6 /* Views */ = { + isa = PBXGroup; + children = ( + E2218D681EF46ED3004298F6 /* Collection View */, + E2218D2F1EF3271F004298F6 /* Document.swift */, + E2218D511EF32AC6004298F6 /* GraphDetailsController.swift */, + E2218D631EF45F37004298F6 /* LossDistributionPie.swift */, + ); + name = Views; + sourceTree = ""; + }; + E2218D651EF463B4004298F6 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E2218D661EF463B4004298F6 /* QuartzCore.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 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 = ""; }; /* 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 */, diff --git a/Docsis Toolkit.xcodeproj/xcuserdata/Kili2.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Docsis Toolkit.xcodeproj/xcuserdata/Kili2.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 865a84f..fe2b454 100644 --- a/Docsis Toolkit.xcodeproj/xcuserdata/Kili2.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/Docsis Toolkit.xcodeproj/xcuserdata/Kili2.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -2,102 +2,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Graphic Analysis 2/CollectionViewItemMonth.swift b/Graphic Analysis 2/CollectionViewItemMonth.swift index f94632b..39cfacd 100644 --- a/Graphic Analysis 2/CollectionViewItemMonth.swift +++ b/Graphic Analysis 2/CollectionViewItemMonth.swift @@ -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 + } } diff --git a/Graphic Analysis 2/CollectionViewItemMonth.xib b/Graphic Analysis 2/CollectionViewItemMonth.xib index 71c5072..273d249 100644 --- a/Graphic Analysis 2/CollectionViewItemMonth.xib +++ b/Graphic Analysis 2/CollectionViewItemMonth.xib @@ -8,6 +8,10 @@ + + + + @@ -18,25 +22,16 @@ - + - + - - - - - - - - - - + @@ -44,12 +39,31 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Graphic Analysis 2/CollectionViewMonth.swift b/Graphic Analysis 2/CollectionViewMonth.swift index 72bec91..8aebd2c 100644 --- a/Graphic Analysis 2/CollectionViewMonth.swift +++ b/Graphic Analysis 2/CollectionViewMonth.swift @@ -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 } } diff --git a/Graphic Analysis 2/Info.plist b/Graphic Analysis 2/Info.plist index ebc8225..9cd434a 100644 --- a/Graphic Analysis 2/Info.plist +++ b/Graphic Analysis 2/Info.plist @@ -44,7 +44,7 @@ CFBundleShortVersionString 2.0 CFBundleVersion - 157 + 208 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/Graphic Analysis 2/LossDistributionPie.swift b/Graphic Analysis 2/LossDistributionPie.swift new file mode 100644 index 0000000..3e9ceed --- /dev/null +++ b/Graphic Analysis 2/LossDistributionPie.swift @@ -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) + } + } + } +} diff --git a/Graphic Analysis 2/buildnum.ver b/Graphic Analysis 2/buildnum.ver index 1a01b6e..ee4023d 100644 --- a/Graphic Analysis 2/buildnum.ver +++ b/Graphic Analysis 2/buildnum.ver @@ -1,2 +1,2 @@ version 2.0 -build 157 +build 208