Эх сурвалжийг харах

Minor file structure & accessibility fix. (#1060)

Moved Platform+Accessibility.swift to Utils folder. Changed
accessibleChartElements to be final since Renderer subclasses should not need to
modify its working. Simply populating it in draw() functions will add
basic accessibility.
Adi 7 жил өмнө
parent
commit
2bfca15767

+ 4 - 4
Charts.xcodeproj/project.pbxproj

@@ -98,7 +98,7 @@
 		9400725714D0DA707DDECD2E /* ViewPortJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA7BDB22C97F39A4B33E38A7 /* ViewPortJob.swift */; };
 		9400725714D0DA707DDECD2E /* ViewPortJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA7BDB22C97F39A4B33E38A7 /* ViewPortJob.swift */; };
 		95B6D6F35684292A62DBEA74 /* LineChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A75AA73C5AA381DA517959 /* LineChartDataSet.swift */; };
 		95B6D6F35684292A62DBEA74 /* LineChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A75AA73C5AA381DA517959 /* LineChartDataSet.swift */; };
 		967EE2EDDE3337C5C4337C59 /* IndexAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10DD0A02E3CF611BD11EBA9B /* IndexAxisValueFormatter.swift */; };
 		967EE2EDDE3337C5C4337C59 /* IndexAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10DD0A02E3CF611BD11EBA9B /* IndexAxisValueFormatter.swift */; };
-		970221AD20ADFA85007410E5 /* Platform+Accessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970221AC20ADFA85007410E5 /* Platform+Accessibility.swift */; };
+		97AD2D4620AF917100F9C24A /* Platform+Accessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD2D4520AF917100F9C24A /* Platform+Accessibility.swift */; };
 		97E033CC0ABEF0F448DAFA8E /* DataApproximator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93EF9709CF635BEE70D1ABC5 /* DataApproximator.swift */; };
 		97E033CC0ABEF0F448DAFA8E /* DataApproximator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93EF9709CF635BEE70D1ABC5 /* DataApproximator.swift */; };
 		98E2EEF45E8933E4AD182D58 /* ChartViewBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFAD7920F76360ADB3B5F5 /* ChartViewBase.swift */; };
 		98E2EEF45E8933E4AD182D58 /* ChartViewBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFAD7920F76360ADB3B5F5 /* ChartViewBase.swift */; };
 		9A26C8DB1F87B01700367599 /* DataApproximator+N.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A26C8DA1F87B01700367599 /* DataApproximator+N.swift */; };
 		9A26C8DB1F87B01700367599 /* DataApproximator+N.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A26C8DA1F87B01700367599 /* DataApproximator+N.swift */; };
@@ -258,7 +258,7 @@
 		923206233CA89FD03565FF87 /* LineScatterCandleRadarRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineScatterCandleRadarRenderer.swift; path = Source/Charts/Renderers/LineScatterCandleRadarRenderer.swift; sourceTree = "<group>"; };
 		923206233CA89FD03565FF87 /* LineScatterCandleRadarRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineScatterCandleRadarRenderer.swift; path = Source/Charts/Renderers/LineScatterCandleRadarRenderer.swift; sourceTree = "<group>"; };
 		9249AD9AEC8C85772365A128 /* ILineScatterCandleRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ILineScatterCandleRadarChartDataSet.swift; path = Source/Charts/Data/Interfaces/ILineScatterCandleRadarChartDataSet.swift; sourceTree = "<group>"; };
 		9249AD9AEC8C85772365A128 /* ILineScatterCandleRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ILineScatterCandleRadarChartDataSet.swift; path = Source/Charts/Data/Interfaces/ILineScatterCandleRadarChartDataSet.swift; sourceTree = "<group>"; };
 		93EF9709CF635BEE70D1ABC5 /* DataApproximator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataApproximator.swift; path = Source/Charts/Filters/DataApproximator.swift; sourceTree = "<group>"; };
 		93EF9709CF635BEE70D1ABC5 /* DataApproximator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataApproximator.swift; path = Source/Charts/Filters/DataApproximator.swift; sourceTree = "<group>"; };
-		970221AC20ADFA85007410E5 /* Platform+Accessibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Platform+Accessibility.swift"; sourceTree = "<group>"; };
+		97AD2D4520AF917100F9C24A /* Platform+Accessibility.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Platform+Accessibility.swift"; path = "Source/Charts/Utils/Platform+Accessibility.swift"; sourceTree = "<group>"; };
 		998F2BFE318471AFC05B50AC /* IHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IHighlighter.swift; path = Source/Charts/Highlight/IHighlighter.swift; sourceTree = "<group>"; };
 		998F2BFE318471AFC05B50AC /* IHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IHighlighter.swift; path = Source/Charts/Highlight/IHighlighter.swift; sourceTree = "<group>"; };
 		9A26C8DA1F87B01700367599 /* DataApproximator+N.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "DataApproximator+N.swift"; path = "Source/Charts/Filters/DataApproximator+N.swift"; sourceTree = "<group>"; };
 		9A26C8DA1F87B01700367599 /* DataApproximator+N.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "DataApproximator+N.swift"; path = "Source/Charts/Filters/DataApproximator+N.swift"; sourceTree = "<group>"; };
 		9D7184C8A5A60A3522AB9B05 /* BarChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartDataProvider.swift; path = Source/Charts/Interfaces/BarChartDataProvider.swift; sourceTree = "<group>"; };
 		9D7184C8A5A60A3522AB9B05 /* BarChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartDataProvider.swift; path = Source/Charts/Interfaces/BarChartDataProvider.swift; sourceTree = "<group>"; };
@@ -586,7 +586,7 @@
 				3FDA09EF973925A110506799 /* ChartUtils.swift */,
 				3FDA09EF973925A110506799 /* ChartUtils.swift */,
 				5A4CFFFB65819121595F06F1 /* Fill.swift */,
 				5A4CFFFB65819121595F06F1 /* Fill.swift */,
 				3ED23C354AFE81818D78E645 /* Platform.swift */,
 				3ED23C354AFE81818D78E645 /* Platform.swift */,
-				970221AC20ADFA85007410E5 /* Platform+Accessibility.swift */,
+				97AD2D4520AF917100F9C24A /* Platform+Accessibility.swift */,
 				FF475B9593B9898853814340 /* Transformer.swift */,
 				FF475B9593B9898853814340 /* Transformer.swift */,
 				324C9127B53A8D39C8B49277 /* TransformerHorizontalBarChart.swift */,
 				324C9127B53A8D39C8B49277 /* TransformerHorizontalBarChart.swift */,
 				72EAEBB7CF73E33565FC2896 /* ViewPortHandler.swift */,
 				72EAEBB7CF73E33565FC2896 /* ViewPortHandler.swift */,
@@ -926,7 +926,7 @@
 				24151B0729D77251A8494D70 /* LineRadarRenderer.swift in Sources */,
 				24151B0729D77251A8494D70 /* LineRadarRenderer.swift in Sources */,
 				B6DCC229615EFE706F64A37D /* LineScatterCandleRadarRenderer.swift in Sources */,
 				B6DCC229615EFE706F64A37D /* LineScatterCandleRadarRenderer.swift in Sources */,
 				795E100895C24049509F1EDE /* PieChartRenderer.swift in Sources */,
 				795E100895C24049509F1EDE /* PieChartRenderer.swift in Sources */,
-				970221AD20ADFA85007410E5 /* Platform+Accessibility.swift in Sources */,
+				97AD2D4620AF917100F9C24A /* Platform+Accessibility.swift in Sources */,
 				69EA073EDF75D49ABE1715D6 /* RadarChartRenderer.swift in Sources */,
 				69EA073EDF75D49ABE1715D6 /* RadarChartRenderer.swift in Sources */,
 				CEF68F42A5390A73113F3663 /* Renderer.swift in Sources */,
 				CEF68F42A5390A73113F3663 /* Renderer.swift in Sources */,
 				796D3E63A37A95FD9D1AB9A1 /* ChevronDownShapeRenderer.swift in Sources */,
 				796D3E63A37A95FD9D1AB9A1 /* ChevronDownShapeRenderer.swift in Sources */,

+ 0 - 207
Platform+Accessibility.swift

@@ -1,207 +0,0 @@
-import Foundation
-
-#if os(iOS) || os(tvOS)
-
-internal func accessibilityPostLayoutChangedNotification(withElement element: Any? = nil)
-{
-    UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, element)
-}
-
-internal func accessibilityPostScreenChangedNotification(withElement element: Any? = nil)
-{
-    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, element)
-}
-
-open class NSUIAccessibilityElement: UIAccessibilityElement
-{
-    private let containerView: UIView
-
-    final var isHeader: Bool = false
-    {
-        didSet
-        {
-            accessibilityTraits = isHeader ? UIAccessibilityTraitHeader : UIAccessibilityTraitNone
-        }
-    }
-
-    final var isSelected: Bool = false
-        {
-        didSet
-        {
-            accessibilityTraits = isSelected ? UIAccessibilityTraitSelected : UIAccessibilityTraitNone
-        }
-    }
-
-    override init(accessibilityContainer container: Any)
-    {
-        // We can force unwrap since all chart views are subclasses of UIView
-        containerView = container as! UIView
-        super.init(accessibilityContainer: container)
-    }
-
-    override open var accessibilityFrame: CGRect
-    {
-        get
-        {
-            return super.accessibilityFrame
-        }
-
-        set
-        {
-            super.accessibilityFrame = containerView.convert(newValue, to: UIScreen.main.coordinateSpace)
-        }
-    }
-}
-
-extension NSUIView
-{
-    /// An array of accessibilityElements that is used to implement UIAccessibilityContainer internally.
-    /// Subclasses **MUST** override this with an array of such elements.
-    @objc open func accessibilityChildren() -> [Any]?
-    {
-        return nil
-    }
-
-    public final override var isAccessibilityElement: Bool
-    {
-        get { return false } // Return false here, so we can make individual elements accessible
-        set { }
-    }
-
-    open override func accessibilityElementCount() -> Int
-    {
-        return accessibilityChildren()?.count ?? 0
-    }
-
-    open override func accessibilityElement(at index: Int) -> Any?
-    {
-        return accessibilityChildren()?[index]
-    }
-
-    open override func index(ofAccessibilityElement element: Any) -> Int
-    {
-        guard let axElement = element as? NSUIAccessibilityElement else { return -1 }
-        return (accessibilityChildren() as? [NSUIAccessibilityElement])?.index(of: axElement) ?? -1
-    }
-}
-
-#endif
-
-#if os(OSX)
-
-internal func accessibilityPostLayoutChangedNotification(withElement element: Any? = nil)
-{
-    guard let validElement = element else { return }
-    NSAccessibilityPostNotification(validElement, .layoutChanged)
-}
-
-internal func accessibilityPostScreenChangedNotification(withElement element: Any? = nil)
-{
-    // Placeholder
-}
-
-open class NSUIAccessibilityElement: NSAccessibilityElement
-{
-    private let containerView: NSView
-
-    final var isHeader: Bool = false
-    {
-        didSet
-        {
-            setAccessibilityRole(isHeader ? .staticText : .none)
-        }
-    }
-
-    // TODO: Make isSelected toggle a selected state in conjunction with a .valueChanged notification
-    /// A placeholder for parity with iOS. Has no effect.
-    final var isSelected: Bool = false
-
-    open var accessibilityLabel: String
-    {
-        get
-        {
-            return accessibilityLabel() ?? ""
-        }
-
-        set
-        {
-            setAccessibilityLabel(newValue)
-        }
-    }
-
-    open var accessibilityFrame: NSRect
-    {
-        get
-        {
-            return accessibilityFrame()
-        }
-
-        set
-        {
-            let bounds = NSAccessibilityFrameInView(containerView, newValue)
-            setAccessibilityFrame(bounds)
-        }
-    }
-
-    init(accessibilityContainer container: Any)
-    {
-        // We can force unwrap since all chart views are subclasses of NSView
-        containerView = container as! NSView
-
-        super.init()
-
-        setAccessibilityParent(containerView)
-        setAccessibilityRole(.row)
-    }
-
-    open override func accessibilityParent() -> Any?
-    {
-        return super.accessibilityParent()
-    }
-}
-
-/*
-/// This would have been needed if the NSAccessibilityList protocol worked.
-extension NSUIAccessibilityElement: NSAccessibilityRow
-{
-    open override func accessibilityChildren() -> [Any]?
-    {
-        return nil
-    }
-
-    open override func accessibilityIdentifier() -> String
-    {
-        return super.accessibilityIdentifier() ?? ""
-    }
-
-    open override func accessibilityIndex() -> Int
-    {
-        guard let parentChartView = containerView as? ChartViewBase else { return -1 }
-        return (parentChartView.accessibilityChildren() as? [NSUIAccessibilityElement])?.index(of: self) ?? -1
-    }
-}
-*/
-
-/// NOTE: Using Swift makes all NSAccessibility methods required
-/// Since the method signatures for accessibilityRows() differ between the NSAccessibilityTable and NSAccessibility protocols,
-/// trying to override or create either causes a compiler error. Hence we resort to calling setAccessibilityRole(.list)
-/// while making NSUIView an NSAccessibilityGroup.
-extension NSUIView: NSAccessibilityGroup
-{
-    open override func accessibilityChildren() -> [Any]?
-    {
-        return nil
-    }
-
-    open override func accessibilityLabel() -> String?
-    {
-        return "Chart View"
-    }
-
-    open override func accessibilityRows() -> [Any]?
-    {
-        return accessibilityChildren()
-    }
-}
-
-#endif

+ 1 - 1
Source/Charts/Renderers/ChartDataRendererBase.swift

@@ -17,7 +17,7 @@ open class DataRenderer: Renderer
 {
 {
     /// An array of elements that are presented to the ChartViewBase accessibility methods.
     /// An array of elements that are presented to the ChartViewBase accessibility methods.
     /// Subclasses should populate this array in drawData() or drawDataSet() to make the chart accessible.
     /// Subclasses should populate this array in drawData() or drawDataSet() to make the chart accessible.
-    @objc open var accessibleChartElements: [NSUIAccessibilityElement] = []
+    @objc final var accessibleChartElements: [NSUIAccessibilityElement] = []
 
 
     @objc open let animator: Animator
     @objc open let animator: Animator