AccentPomodoro / Accent Pomodoro / ContentView.swift
ContentView.swift
Raw
//
//  ContentView.swift
//  Accent Pomodoro
//
//  Created by Luke Jenquin on 11/20/21.
//

import SwiftUI

struct ContentView: View {
    @State private var color: String = ""
    @State private var currentDate = Date()
    @State private var minutesRemaining = 0
    @State private var secondsRemaining = 0
    @State private var wasDarkMode = false
    @State private var wasColor = 0
    @State private var currentMode = 0
    @State private var timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    @State var changer: MenuBarColorChanger
    @ObservedObject var userSelections: userSelectionsModel
    
    var body: some View {
        VStack{
            Text("\(minutesRemaining):\(String(format: "%02d", secondsRemaining))").onReceive(timer) {
                _ in if (minutesRemaining > 0 || secondsRemaining > 1 ) {
                    if ( secondsRemaining == 0 ) {
                        minutesRemaining -= 1
                        secondsRemaining = 59
                    } else {
                        secondsRemaining -= 1
                    }
                } else if ( minutesRemaining == 0 && secondsRemaining == 1 ){
                    secondsRemaining = 0
                    switchTimers()
                }
            }
            Button("Start", action: startTimer)
            Button("Stop Timer", action: stopTimer)
            Button("Reset", action: reset)
        }.padding()
    }
    
    func startTimer() {
        if ( minutesRemaining == 0 && secondsRemaining == 0){
            minutesRemaining = userSelections.focusTime
            currentMode = 0
            changer.changeMenuColor(colorChange: currentMode)
            wasDarkMode = ( UserDefaults.standard.string(forKey: "AppleInterfaceStyle") == "Dark" )
            if ( userSelections.focusDarkMode == 1 && wasDarkMode ) {
                setDarkMode()
            } else if ( userSelections.focusDarkMode == 2 && !wasDarkMode ) {
                setDarkMode()
            }
//            -2 (nil): multicolor (default)
//            -1: graphite
//            0: red
//            1: orange
//            2: yellow
//            3: green
//            4: blue
//            5: purple
//            6: pink
            let selected = userSelections.focusSelected
            wasColor = Int(UserDefaults.standard.string(forKey: "AppleAccentColor") ?? "-2") ?? -2
            if ( selected == 1 && wasColor != -2 ){
                color = (String) (selected + 5)
                setAccent()
            } else if ( ( selected > 1 && selected < 5 && selected != wasColor - 2 ) || ( selected > 4 && selected < 9 && selected != wasColor + 5 ) || ( selected == 9 && wasColor != -1 ) ) {
                color = (String) (selected + 7)
                setAccent()
            }
        }
        timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    }
    
    func stopTimer() {
        self.timer.upstream.connect().cancel()
    }
    
    func switchTimers() {
        if (currentMode == 0) {
            if ( userSelections.relaxDarkMode == 1 && UserDefaults.standard.string(forKey: "AppleInterfaceStyle") == "Dark" ){
                setDarkMode()
            } else if ( userSelections.relaxDarkMode == 2 && UserDefaults.standard.string(forKey: "AppleInterfaceStyle") == "Light" ) {
                setDarkMode()
            }
            let selected = userSelections.relaxSelected
            let currentColor = Int(UserDefaults.standard.string(forKey: "AppleAccentColor") ?? "-2") ?? -2
            if( selected == userSelections.focusSelected ){
                // Ignore accent switching
            } else if ( selected == 1 && currentColor != -2 ) {
                color = (String) (selected + 5)
                setAccent()
            } else if ( ( selected > 1 && selected < 5 && selected != currentColor - 2 ) || ( selected > 4 && selected < 9 && selected != currentColor + 5 ) || ( selected == 9 && currentColor != -1 ) ) {
                color = (String) (selected + 7)
                setAccent()
            }
            currentMode = 1;
            changer.changeMenuColor(colorChange: currentMode)
            minutesRemaining = userSelections.relaxTime
        } else {
            if ( userSelections.focusDarkMode == 1 && UserDefaults.standard.string(forKey: "AppleInterfaceStyle") == "Dark" ) {
                setDarkMode()
            } else if ( userSelections.focusDarkMode == 2 && UserDefaults.standard.string(forKey: "AppleInterfaceStyle") == nil ) {
                setDarkMode()
            }
            let selected = userSelections.focusSelected
            let currentColor = Int(UserDefaults.standard.string(forKey: "AppleAccentColor") ?? "-2") ?? -2
            if( userSelections.relaxSelected == selected ){
                // Ignore accent switching
            } else if ( selected == 1 && currentColor != -2 ){
                color = (String) (selected + 5)
                setAccent()
            } else if ( ( selected > 1 && selected < 5 && selected != currentColor - 2 ) || ( selected > 4 && selected < 9 && selected != currentColor + 5 ) || ( selected == 9 && currentColor != -1 ) ) {
                color = (String) (selected + 7)
                setAccent()
            }
            currentMode = 0;
            changer.changeMenuColor(colorChange: currentMode)
            minutesRemaining = userSelections.focusTime
        }
        startTimer()
    }
    
    func setLightMode() {
        color = "1"
        setAccent()
    }
    
    func setDarkMode2() {
        color = "2"
        setAccent()
    }
    
    func setMulticolor() {
        color = "4"
        setAccent()
    }
    
    func setBlue() {
        color = "5"
        setAccent()
    }
    
    func setPurple() {
        color = "6"
        setAccent()
    }
    
    func setPink() {
        color = "7"
        setAccent()
    }
    
    func setRed() {
        color = "8"
        setAccent()
    }
    
    func setOrange() {
        color = "9"
        setAccent()
    }
    
    func setYellow() {
        color = "10"
        setAccent()
    }
    
    func setGreen() {
        color = "11"
        setAccent()
    }
    
    func setGraphite() {
        color = "12"
        setAccent()
    }
    
    func setDarkMode() {
        let dark = Process()
        dark.launchPath = "/usr/bin/osascript"
        dark.arguments = ["\(NSHomeDirectory())/Developer/Accent Pomodoro/Accent Pomodoro/ChangeDarkMode.scpt"]
        dark.launch()
    }
    
    func setAccent() {
        let accent = Process()
        accent.launchPath = "/usr/bin/osascript"
        accent.arguments = ["\(NSHomeDirectory())/Developer/Accent Pomodoro/Accent Pomodoro/ChangeAccent.scpt", color]
        accent.launch()
    }
    
    func reset() {
        stopTimer()
        minutesRemaining = 0
        secondsRemaining = 0
        currentMode = 0
        let currentColor = Int(UserDefaults.standard.string(forKey: "AppleAccentColor") ?? "-2") ?? -2
        if ( currentColor != wasColor ){
            if ( wasColor == -2 ){
                color = (String) (6)
                setAccent()
            } else if ( wasColor > 3 ) {
                color = (String) (wasColor + 5)
                setAccent()
            } else if ( wasColor > -1 && wasColor < 4 ) {
                color = (String) (wasColor + 12)
                setAccent()
            } else if ( wasColor == -1 ) {
                color = (String) (17)
                setAccent()
            }
        }
        let isDarkMode = UserDefaults.standard.string(forKey: "AppleInterfaceStyle") == "Dark"
        if ( ( wasDarkMode && !isDarkMode ) || ( !wasDarkMode && isDarkMode )) {
            setDarkMode()
        }
        changer.resetWallpapers()
    }
}