Skip to content

Commit

Permalink
Merge pull request #85 from DeluxeAlonso/feature/improvements
Browse files Browse the repository at this point in the history
Feature/improvements - Calculator buttons redesign
  • Loading branch information
DeluxeAlonso committed Jan 8, 2024
2 parents 150100b + e6e01f7 commit e89bf89
Show file tree
Hide file tree
Showing 18 changed files with 266 additions and 38 deletions.
88 changes: 68 additions & 20 deletions CalculatorReplicaSwiftUI.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,15 @@
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E2FBCEBF2441608600147B1B"
BuildableName = "Calculator.app"
BlueprintName = "CalculatorReplicaSwiftUI"
ReferencedContainer = "container:CalculatorReplicaSwiftUI.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,18 @@ struct CalculatorButtonsView: View {
var body: some View {
ForEach(0...env.calculatorButtons.count - 1, id: \.self) { index in
HStack(spacing: 12) {
ForEach(self.env.calculatorButtons[index], id: \.title) { button in
CalculatorButtonView(button: button)
ForEach(env.calculatorButtons[index], id: \.title) { button in
containedView(button)
}
}
}
}

private func containedView(_ button: CalculatorButtonProtocol) -> AnyView {
if let calculatorImageButton = CalculatorImageButtonAdapter(button) {
return CalculatorImageButton(button: calculatorImageButton).erasedToAnyView()
}
let calculatorTextButton = CalculatorTextButtonAdapter(button)
return CalculatorTextButton(button: calculatorTextButton).erasedToAnyView()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//
// CalculatorImageButton.swift
// CalculatorReplicaSwiftUI
//
// Created by Alonso on 7/01/24.
// Copyright © 2024 Alonso. All rights reserved.
//

import SwiftUI

struct CalculatorImageButton: View {
@EnvironmentObject var env: CalculatorEnvironmentObject

let button: CalculatorImageButtonProtocol

var body: some View {
Button(action: {
env.handleCalculatorButton(identifier: button.identifier)
}, label: {
Image(systemName: button.imageName)
.font(.system(size: 25.0, weight: .medium))
.calculatorButtonStyle(for: button.style)
})
.accessibility(label: Text(button.accessibilityLabel))
}
}

struct CalculatorImageButton_Previews: PreviewProvider {
static var previews: some View {
let calculatorImageButton = CalculatorImageButtonAdapter(identifier: "",
imageName: "plus",
accessibilityLabel: "",
style: CalculatorButtonStyle(gridSpace: 1,
tintColor: .blue,
backgroundColor: .black))
CalculatorImageButton(button: calculatorImageButton)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// CalculatorImageButtonAdapter.swift
// CalculatorReplicaSwiftUI
//
// Created by Alonso on 7/01/24.
// Copyright © 2024 Alonso. All rights reserved.
//

import Foundation

struct CalculatorImageButtonAdapter: CalculatorImageButtonProtocol {
let identifier: String
let imageName: String
let accessibilityLabel: String
let style: CalculatorButtonStyleProtocol

init(identifier: String, imageName: String, accessibilityLabel: String, style: CalculatorButtonStyleProtocol) {
self.identifier = identifier
self.imageName = imageName
self.accessibilityLabel = accessibilityLabel
self.style = style
}

init?(_ calculatorButton: CalculatorButtonProtocol) {
guard let imageName = calculatorButton.icon else { return nil }
self.identifier = calculatorButton.identifier
self.imageName = imageName
self.accessibilityLabel = calculatorButton.accessibilityLabel
self.style = calculatorButton.style
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// CalculatorImageButtonProtocol.swift
// CalculatorReplicaSwiftUI
//
// Created by Alonso on 7/01/24.
// Copyright © 2024 Alonso. All rights reserved.
//

import Foundation

protocol CalculatorImageButtonProtocol {
var identifier: String { get }
var imageName: String { get }
var accessibilityLabel: String { get }
var style: CalculatorButtonStyleProtocol { get }
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// CalculatorButtonView.swift
// CalculatorButtonViewLegacy.swift
// CalculatorReplicaSwiftUI
//
// Created by Alonso on 4/11/20.
Expand All @@ -8,7 +8,7 @@

import SwiftUI

struct CalculatorButtonView: View {
struct CalculatorButtonViewLegacy: View {
@EnvironmentObject var env: CalculatorEnvironmentObject

let button: CalculatorButtonProtocol
Expand All @@ -24,9 +24,9 @@ struct CalculatorButtonView: View {

private func containedView() -> AnyView {
if let iconName = button.icon {
return CalculatorImageButton(imageName: iconName, style: button.style).erasedToAnyView()
return CalculatorImageButtonLegacy(imageName: iconName, style: button.style).erasedToAnyView()
} else {
return CalculatorTextButton(text: button.title, style: button.style).erasedToAnyView()
return CalculatorTextButtonLegacy(text: button.title, style: button.style).erasedToAnyView()
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// CalculatorImageButton.swift
// CalculatorImageButtonLegacy.swift
// CalculatorReplicaSwiftUI
//
// Created by Alonso on 5/1/20.
Expand All @@ -8,7 +8,7 @@

import SwiftUI

struct CalculatorImageButton: View {
struct CalculatorImageButtonLegacy: View {
let imageName: String
let style: CalculatorButtonStyleProtocol

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// CalculatorTextButton.swift
// CalculatorTextButtonLegacy.swift
// CalculatorReplicaSwiftUI
//
// Created by Alonso on 5/1/20.
Expand All @@ -8,7 +8,7 @@

import SwiftUI

struct CalculatorTextButton: View {
struct CalculatorTextButtonLegacy: View {
let text: String
let style: CalculatorButtonStyleProtocol

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// CalculatorTextButton.swift
// CalculatorReplicaSwiftUI
//
// Created by Alonso on 7/01/24.
// Copyright © 2024 Alonso. All rights reserved.
//

import SwiftUI

struct CalculatorTextButton: View {
@EnvironmentObject var env: CalculatorEnvironmentObject

let button: CalculatorTextButtonProtocol

var body: some View {
Button(action: {
env.handleCalculatorButton(identifier: button.identifier)
}, label: {
Text(button.text)
.font(.system(size: 32.0))
.calculatorButtonStyle(for: button.style)
})
.accessibility(label: Text(button.accessibilityLabel))
}
}

struct CalculatorTextButton_Previews: PreviewProvider {
static var previews: some View {
CalculatorTextButton(button: CalculatorTextButtonAdapter(CalculatorButton(representable: .eight)))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
//
// CalculatorTextButtonAdapter.swift
// CalculatorReplicaSwiftUI
//
// Created by Alonso on 7/01/24.
// Copyright © 2024 Alonso. All rights reserved.
//

import Foundation

struct CalculatorTextButtonAdapter: CalculatorTextButtonProtocol {
let identifier: String
let text: String
let accessibilityLabel: String
let style: CalculatorButtonStyleProtocol

init(identifier: String, text: String, accessibilityLabel: String, style: CalculatorButtonStyleProtocol) {
self.identifier = identifier
self.text = text
self.accessibilityLabel = accessibilityLabel
self.style = style
}

init(_ calculatorButton: CalculatorButtonProtocol) {
self.identifier = calculatorButton.identifier
self.text = calculatorButton.title
self.accessibilityLabel = calculatorButton.accessibilityLabel
self.style = calculatorButton.style
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// CalculatorTextButtonProtocol.swift
// CalculatorReplicaSwiftUI
//
// Created by Alonso on 7/01/24.
// Copyright © 2024 Alonso. All rights reserved.
//

import Foundation

protocol CalculatorTextButtonProtocol {
var identifier: String { get }
var text: String { get }
var accessibilityLabel: String { get }
var style: CalculatorButtonStyleProtocol { get }
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// CalculatorImageButtonTests.swift
// CalculatorImageButtonLegacyTests.swift
// CalculatorReplicaSwiftUISnapshotTests
//
// Created by Alonso on 12/11/23.
Expand All @@ -10,21 +10,21 @@ import SnapshotTesting
@testable import Calculator
import XCTest

final class CalculatorImageButtonTests: XCTestCase {
final class CalculatorImageButtonLegacyTests: XCTestCase {

func testCalculatorImageButton() {
let style = CalculatorButtonStyleProtocolMock()
style.gridSpace = 1

let view = CalculatorImageButton(imageName: "plus", style: style)
let view = CalculatorImageButtonLegacy(imageName: "plus", style: style)
assertSnapshot(of: view, as: .image)
}

func testCalculatorImageButtonExpandedGridSpace() {
let style = CalculatorButtonStyleProtocolMock()
style.gridSpace = 2

let view = CalculatorImageButton(imageName: "plus", style: style)
let view = CalculatorImageButtonLegacy(imageName: "plus", style: style)
assertSnapshot(of: view, as: .image)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// CalculatorTextButtonTests.swift
// CalculatorTextButtonLegacyTests.swift
// CalculatorReplicaSwiftUISnapshotTests
//
// Created by Alonso on 12/11/23.
Expand All @@ -10,21 +10,21 @@ import SnapshotTesting
@testable import Calculator
import XCTest

final class CalculatorTextButtonTests: XCTestCase {
final class CalculatorTextButtonLegacyTests: XCTestCase {

func testCalculatorTextButton() {
let style = CalculatorButtonStyleProtocolMock()
style.gridSpace = 1

let view = CalculatorTextButton(text: "1", style: style)
let view = CalculatorTextButtonLegacy(text: "1", style: style)
assertSnapshot(of: view, as: .image)
}

func testCalculatorTextButtonExpandedGridSpace() {
let style = CalculatorButtonStyleProtocolMock()
style.gridSpace = 2

let view = CalculatorTextButton(text: "1", style: style)
let view = CalculatorTextButtonLegacy(text: "1", style: style)
assertSnapshot(of: view, as: .image)
}

Expand Down

0 comments on commit e89bf89

Please sign in to comment.