163 lines
4.8 KiB
Swift
163 lines
4.8 KiB
Swift
//
|
|
// ContentView.swift
|
|
// mrCalculator
|
|
//
|
|
// Created by mrtuxa on 25.08.22.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
enum CalcButton: String {
|
|
case one = "1"
|
|
case two = "2"
|
|
case three = "3"
|
|
case four = "4"
|
|
case five = "5"
|
|
case six = "6"
|
|
case seven = "7"
|
|
case eight = "8"
|
|
case nine = "9"
|
|
case zero = "0"
|
|
case add = "+"
|
|
case subtract = "-"
|
|
case divide = "/"
|
|
case multiply = "x"
|
|
case equal = "="
|
|
case clear = "AC"
|
|
case decimal = "."
|
|
case percent = "%"
|
|
case negative = "-/+"
|
|
|
|
var buttonColor: Color {
|
|
switch self {
|
|
case .add, .subtract, .multiply, .divide, .equal:
|
|
return .orange
|
|
case .clear, .negative, .percent:
|
|
return Color(.lightGray)
|
|
default:
|
|
return Color(UIColor(red: 55/255.0, green: 55/255.0, blue: 55/255.0, alpha: 1))
|
|
}
|
|
}
|
|
}
|
|
|
|
enum operation {
|
|
case add, subtract, multiply, divide, none
|
|
}
|
|
|
|
struct ContentView: View {
|
|
|
|
@State var value = "0"
|
|
@State var currentOperation: operation = .none
|
|
@State var runningNumber = 0
|
|
|
|
let buttons: [[CalcButton]] = [
|
|
[.clear, .negative, .percent, .divide],
|
|
[.seven, .eight, .nine, .multiply],
|
|
[.four, .five, .six, .subtract],
|
|
[.one, .two, .three, .add],
|
|
[.zero, .decimal, .equal]
|
|
]
|
|
|
|
var body: some View {
|
|
ZStack {
|
|
Color.black.edgesIgnoringSafeArea(.all)
|
|
|
|
VStack {
|
|
Spacer()
|
|
|
|
// Text display
|
|
HStack {
|
|
Spacer()
|
|
Text("0")
|
|
.bold()
|
|
.font(.system(size: 100))
|
|
.foregroundColor(.white)
|
|
}.padding()
|
|
|
|
// Buttons
|
|
ForEach(buttons, id: \.self) { row in
|
|
HStack(spacing: 12) {
|
|
ForEach(row, id: \.self) { item in
|
|
Button(action: {
|
|
self.onTapListener(button: item)
|
|
}, label: {
|
|
Text(item.rawValue)
|
|
.font(.system(size: 32))
|
|
.frame(width: self.buttonWidth(item: item),
|
|
height: self.buttonHeight())
|
|
.background(item.buttonColor)
|
|
.foregroundColor(.white)
|
|
.cornerRadius(self.buttonWidth(item: item)/2)
|
|
})
|
|
}
|
|
}.padding(.bottom, 3)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func onTapListener(button: CalcButton) {
|
|
switch button {
|
|
case .add, .subtract, .multiply, .divide, .equal:
|
|
if button == .add {
|
|
self.currentOperation = .add
|
|
self.runningNumber += Int(self.value) ?? 0
|
|
} else if button == .subtract {
|
|
self.currentOperation = .subtract
|
|
self.runningNumber += Int(self.value) ?? 0
|
|
} else if button == .multiply {
|
|
self.currentOperation = .multiply
|
|
self.runningNumber += Int(self.value) ?? 0
|
|
} else if button == .divide {
|
|
self.currentOperation = .divide
|
|
self.runningNumber += Int(self.value) ?? 0
|
|
} else if button == .equal {
|
|
let runningValue = self.runningNumber
|
|
let currentValue = Int(self.value) ?? 0
|
|
switch self.currentOperation {
|
|
case .add: self.value = "\(runningValue + currentValue)"
|
|
case .subtract: self.value = "\(runningValue - currentValue)"
|
|
case .multiply: self.value = "\(runningValue * currentValue)"
|
|
case .divide: self.value = "\(runningValue / currentValue)"
|
|
case .none:
|
|
break
|
|
}
|
|
}
|
|
|
|
if button != .equal {
|
|
self.value = "0"
|
|
}
|
|
|
|
case .clear:
|
|
break
|
|
case .decimal, .negative, .percent:
|
|
break
|
|
default:
|
|
let number = button.rawValue
|
|
if self.value == "0" {
|
|
value = number
|
|
} else {
|
|
self.value = "\(self.value)\(number)"
|
|
}
|
|
}
|
|
}
|
|
|
|
func buttonWidth(item: CalcButton) -> CGFloat {
|
|
if item == .zero {
|
|
return ((UIScreen.main.bounds.width - (4*12)) / 4) * 2
|
|
}
|
|
return (UIScreen.main.bounds.width - (5*12)) / 4
|
|
}
|
|
|
|
func buttonHeight() -> CGFloat {
|
|
return (UIScreen.main.bounds.width - (5*12)) / 4
|
|
}
|
|
}
|
|
|
|
|
|
struct ContentView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
ContentView()
|
|
}
|
|
}
|