diff --git a/Docsis Toolkit.xcodeproj/project.pbxproj b/Docsis Toolkit.xcodeproj/project.pbxproj index c4571de..6f146aa 100644 --- a/Docsis Toolkit.xcodeproj/project.pbxproj +++ b/Docsis Toolkit.xcodeproj/project.pbxproj @@ -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 = ""; }; 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; }; + E262463C1EF55BCE00EAA4A6 /* GraphWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphWindow.swift; sourceTree = ""; }; + E262463D1EF55BCE00EAA4A6 /* GraphWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GraphWindow.xib; sourceTree = ""; }; /* 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 */ }; diff --git a/Docsis Toolkit.xcodeproj/xcuserdata/Kili2.xcuserdatad/xcschemes/Graphic Analysis 2.xcscheme b/Docsis Toolkit.xcodeproj/xcuserdata/Kili2.xcuserdatad/xcschemes/Graphic Analysis 2.xcscheme index 886851d..0eeadbe 100644 --- a/Docsis Toolkit.xcodeproj/xcuserdata/Kili2.xcuserdatad/xcschemes/Graphic Analysis 2.xcscheme +++ b/Docsis Toolkit.xcodeproj/xcuserdata/Kili2.xcuserdatad/xcschemes/Graphic Analysis 2.xcscheme @@ -61,6 +61,13 @@ ReferencedContainer = "container:Docsis Toolkit.xcodeproj"> + + + + diff --git a/Graphic Analysis 2/CollectionViewItemMonth.swift b/Graphic Analysis 2/CollectionViewItemMonth.swift index 39cfacd..56e98eb 100644 --- a/Graphic Analysis 2/CollectionViewItemMonth.swift +++ b/Graphic Analysis 2/CollectionViewItemMonth.swift @@ -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 + } } } diff --git a/Graphic Analysis 2/CollectionViewItemMonth.xib b/Graphic Analysis 2/CollectionViewItemMonth.xib index 987e21b..28c3db9 100644 --- a/Graphic Analysis 2/CollectionViewItemMonth.xib +++ b/Graphic Analysis 2/CollectionViewItemMonth.xib @@ -12,6 +12,7 @@ + @@ -22,7 +23,7 @@ - + @@ -74,6 +75,15 @@ + + + + + + + + + @@ -83,6 +93,7 @@ + diff --git a/Graphic Analysis 2/CollectionViewMonth.swift b/Graphic Analysis 2/CollectionViewMonth.swift index 0f359ce..3a69bfd 100644 --- a/Graphic Analysis 2/CollectionViewMonth.swift +++ b/Graphic Analysis 2/CollectionViewMonth.swift @@ -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) { - 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) { - 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() } } diff --git a/Graphic Analysis 2/CollectionViewYear.swift b/Graphic Analysis 2/CollectionViewYear.swift index 3e4ab91..1f68c90 100644 --- a/Graphic Analysis 2/CollectionViewYear.swift +++ b/Graphic Analysis 2/CollectionViewYear.swift @@ -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) { (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) { 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() } } diff --git a/Graphic Analysis 2/Document.swift b/Graphic Analysis 2/Document.swift index 063bb74..48c8d2d 100644 --- a/Graphic Analysis 2/Document.swift +++ b/Graphic Analysis 2/Document.swift @@ -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 + } } diff --git a/Graphic Analysis 2/Document.xib b/Graphic Analysis 2/Document.xib index dca56f1..55330b9 100644 --- a/Graphic Analysis 2/Document.xib +++ b/Graphic Analysis 2/Document.xib @@ -10,6 +10,7 @@ + @@ -18,22 +19,21 @@ - + - - + + - + - - - - + + + - + @@ -44,6 +44,10 @@ + + + + - - - - + + + - + @@ -71,21 +74,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/Graphic Analysis 2/GraphWindow.swift b/Graphic Analysis 2/GraphWindow.swift new file mode 100644 index 0000000..a4ab5c6 --- /dev/null +++ b/Graphic Analysis 2/GraphWindow.swift @@ -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 + } +} diff --git a/Graphic Analysis 2/GraphWindow.xib b/Graphic Analysis 2/GraphWindow.xib new file mode 100644 index 0000000..a01107b --- /dev/null +++ b/Graphic Analysis 2/GraphWindow.xib @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Graphic Analysis 2/Info.plist b/Graphic Analysis 2/Info.plist index 6bf5fec..f8212ff 100644 --- a/Graphic Analysis 2/Info.plist +++ b/Graphic Analysis 2/Info.plist @@ -44,7 +44,7 @@ CFBundleShortVersionString 2.0 CFBundleVersion - 216 + 297 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/Graphic Analysis 2/LossDistributionPie.swift b/Graphic Analysis 2/LossDistributionPie.swift index 3e9ceed..4870f63 100644 --- a/Graphic Analysis 2/LossDistributionPie.swift +++ b/Graphic Analysis 2/LossDistributionPie.swift @@ -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) } } } diff --git a/Graphic Analysis 2/MainMenu.xib b/Graphic Analysis 2/MainMenu.xib index 1751a1b..15c54da 100644 --- a/Graphic Analysis 2/MainMenu.xib +++ b/Graphic Analysis 2/MainMenu.xib @@ -81,6 +81,12 @@ + + + + + + diff --git a/Graphic Analysis 2/buildnum.ver b/Graphic Analysis 2/buildnum.ver index d7387f2..20335fc 100644 --- a/Graphic Analysis 2/buildnum.ver +++ b/Graphic Analysis 2/buildnum.ver @@ -1,2 +1,2 @@ version 2.0 -build 216 +build 297