Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
folium-app
GitHub Repository: folium-app/Folium
Path: blob/a-new-beginning/Folium-iOS/Classes/SkinManager/Skin/Button.swift
2 views
//
//  Button.swift
//  Folium-iOS
//
//  Created by Jarrod Norwell on 13/6/2024.
//

import Foundation
import UIKit

struct Button : Codable, Hashable {
    enum `Type` : String, Codable, Hashable {
        case a = "a"
        case b = "b"
        case x = "x"
        case y = "y"
        
        /*
         added for SEGA Genesis and Mega Drive
         */
        case c = "c",
             z = "z"
        
        case up = "up"
        case down = "down"
        case left = "left"
        case right = "right"
        
        case l = "l"
        case r = "r"
        
        case zl = "zl"
        case zr = "zr"
        
        case home = "home"
        case minus = "minus"
        case plus = "plus"
        
        case settings = "settings"
        
        case loadState = "loadState"
        case saveState = "saveState"
        
        init(rawValue: String) {
            self = switch rawValue {
            case "a", "circle": .a
            case "b", "cross": .b
            case "x", "triangle": .x
            case "y", "square": .y
                
            case "c": .c
            case "z": .z
                
            case "up", "dpadUp": .up
            case "down", "dpadDown": .down
            case "left", "dpadLeft": .left
            case "right", "dpadRight": .right
                
            case "l", "l1": .l
            case "r", "r1": .r
            case "zl", "l2": .zl
            case "zr", "r2": .zr
                
            case "home": .home
            case "minus", "select": .minus
            case "plus", "start": .plus
                
            case "settings": .settings
            case "loadState": .loadState
            case "saveState": .saveState
            default: .a
            }
        }
    }
    
    var alpha: Double? = 1
    let x, y: Double
    let width, height: Double
    let type: `Type`
    
    var backgroundImageName: String? = nil
    var buttonClassName: String? = "defaultButton"
    var transparent: Bool? = false
    var vibrateOnTap: Bool? = true
    
    struct BorderedStyle : Codable, Hashable {
        let borderColor: String // hex
        let borderWidth: CGFloat
    }
    
    struct DefaultStyle : Codable, Hashable {
        let backgroundImageName: String
    }
    
    var borderedStyle: BorderedStyle? = nil
    var defaultStyle: DefaultStyle? = nil
    
    func letter(for core: Core) -> String? {
        switch type {
        case .a:
            core.nintendo ? "A" : nil
        case .b:
            core.nintendo ? "B" : nil
        case .x:
            core.nintendo ? "X" : nil
        case .y:
            core.nintendo ? "Y" : nil
        case .c:
            core.nintendo ? "C" : nil
        case .z:
            core.nintendo ? "Z" : nil
        case .l:
            core.nintendo ? "L" : "L1"
        case .r:
            core.nintendo ? "R" : "R1"
        case .zl:
            core.nintendo ? "ZL" : "L2"
        case .zr:
            core.nintendo ? "ZR" : "R2"
        default:
            nil
        }
    }
    
    func image(for core: Core) -> UIImage? {
        switch type {
        case .a:
            return .init(systemName: core.nintendo ? "a.circle" : "circle")
        case .b:
            return .init(systemName: core.nintendo ? "b.circle" : "xmark")
        case .x:
            return .init(systemName: core.nintendo ? "x.circle" : "triangle")
        case .y:
            return .init(systemName: core.nintendo ? "y.circle" : "square")
            
        case .c, .z: return nil
            
        case .up:
            return .init(systemName: "arrow.up")
        case .down:
            return .init(systemName: "arrow.down")
        case .left:
            return .init(systemName: "arrow.left")
        case .right:
            return .init(systemName: "arrow.right")
            
        case .l, .r: return nil
            
        case .zl, .zr: return nil
            
        case .home:
            return .init(systemName: "house")
        case .minus:
            return .init(systemName: "minus")
        case .plus:
            return .init(systemName: "plus")
            
        case .settings:
            return .init(systemName: "ellipsis")
            
        case .loadState:
            // let string = if #available(iOS 18, *) { "arrow.up.document" } else { "arrow.up.doc" }
            return .init(systemName: "square.and.arrow.up.on.square")
        case .saveState:
            // let string = if #available(iOS 18, *) { "arrow.down.document" } else { "arrow.down.doc" }
            return .init(systemName: "square.and.arrow.down.on.square")
        }
    }
}