USB-Meter / USB Meter / Model / ChartContext.swift
Newer Older
104 lines | 2.608kb
Bogdan Timofte authored 2 weeks ago
1
//
2
//  ChartContext.swift
3
//  USB Meter
4
//
5
//  Created by Bogdan Timofte on 14/04/2020.
6
//  Copyright © 2020 Bogdan Timofte. All rights reserved.
7
//
8

            
9
import CoreGraphics
10
import SwiftUI
11

            
12
class ChartContext {
13
    private var rect : CGRect?
14
    private var pad: CGFloat = 0
15

            
16
    var isValid: Bool {
17
        get {
18
            return rect != nil && rect!.width > 0 && rect!.height > 0
19
        }
20
    }
21

            
22
    var size: CGSize {
23
        get {
24
            guard rect != nil else {
25
                track("Invalid Context")
26
                fatalError()
27
            }
28
            return rect!.size
29
        }
30
    }
31

            
32
    var origin: CGPoint {
33
        get {
34
            guard rect != nil else {
35
                track("Invalid Context")
36
                fatalError()
37
            }
38
            return rect!.origin
39
        }
40
    }
41

            
42
    var minValue: Double {
43
        return rect == nil ? .nan : Double(rect!.minY)
44
    }
45

            
46
    var maxValue: Double {
47
        get {
48
            return rect == nil ? .nan : Double(rect!.maxY)
49
        }
50
    }
51

            
52
    func reset() {
53
        rect = nil
54
        padding()
55
    }
56
    func include( point: CGPoint )  {
57
        if rect == nil {
58
            rect = CGRect(origin: point, size: .zero)
59
            padding()
60
        } else {
61
            rect = rect!.union(CGRect(origin: point, size: .zero))
62
            padding()
63
        }
64
    }
65

            
66
    func padding() {
67
        guard rect != nil else {
68
            track("Invalid Context")
69
            pad = 0
70
            fatalError()
71
        }
72
        pad = rect!.size.height * Constants.chartUnderscan
73
    }
74

            
75
    func yAxisLabel( for itemNo: Int, of items: Int ) -> Double {
76
        let labelSpace = Double(rect!.height) / Double(items - 1)
77
        let labelRelativeValue = labelSpace * Double(itemNo - 1)
78
        return minValue + labelRelativeValue
79
    }
80

            
81
    // MARK: Conversii dubioase
82
    func xAxisLabel( for itemNo: Int, of items: Int ) -> Double {
83
        let labelSpace = Double(rect!.width) / Double(items - 1)
84
        let labelRelativeValue = labelSpace * Double(itemNo - 1)
85
        return Double(rect!.origin.x) + labelRelativeValue
86
    }
87

            
88
    func placeInRect (point: CGPoint) -> CGPoint {
89
        guard rect != nil else {
90
            track("Invalid Context")
91
            fatalError()
92
        }
93
        guard rect!.width != 0 else {
94
            fatalError()
95
        }
96
        guard rect!.height != 0 else {
97
            fatalError()
98
        }
99

            
100
        let x = (point.x - rect!.origin.x)/rect!.width
101
        let y = (pad + point.y - rect!.origin.y)/rect!.height
102
        return CGPoint(x: x, y: 1 - y * Constants.chartOverscan)
103
    }
104
}