This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
lass AppUpdateHandler: ObservableObject { | |
#if SPARKLE | |
private let delegateHandler = SparkleDelegateHandler() | |
let sparkle: SPUStandardUpdaterController | |
init() { | |
// Setup sparkle updater | |
// https://docs.microsoft.com/en-us/appcenter/distribution/sparkleupdates | |
// https://rambo.codes/posts/2021-01-08-distributing-mac-apps-outside-the-app-store | |
sparkle = SPUStandardUpdaterController(updaterDelegate: delegateHandler, userDriverDelegate: delegateHandler) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import InterposeKit | |
import OSLog | |
/// Hack tow work around Assertion failure in -[NSTouchBarLayout setLeadingWidgetWidth:], NSTouchBarLayout.m:78 | |
/// This sometimes happens when macOS restores a window. | |
/// This even runs if there is no OS-level touch bar. | |
class MacOSWorkarounds { | |
static let logger = Logger(category: "MacOSWorkarounds") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- In almost all cases where you type `@ObservedObject`, you really want `@StateObject`. | |
If you need to support iOS 13, use `@State` on parent and pass value into child with `@ObservedObject` to simulate `@StateObject`. | |
Pass arguments to that model in `onAppear`. Example: https://github.com/ra1028/SwiftUI-Hooks/blob/main/Sources/Hooks/HookScope.swift#L39-L41 | |
``` | |
.onAppear { | |
model.onAppear(userTag: userTag) | |
} | |
.onDisappear { | |
model.onDisappear() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- Optimize Hashable and Equatable. e.g. if you have an id, just use that - instead of having the system use reflection and diff all properties: | |
public func hash(into hasher: inout Hasher) { | |
hasher.combine(id) | |
} | |
public static func == (lhs: UserBox, rhs: UserBox) -> Bool { | |
return lhs.id == rhs.id | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension Color { | |
/// Return a random color | |
static var random: Color { | |
return Color( | |
red: .random(in: 0...1), | |
green: .random(in: 0...1), | |
blue: .random(in: 0...1) | |
) | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.onDrop(of: [.fileURL], isTargeted: nil) { providers in | |
if let loadableProvider = providers.first(where: { $0.canLoadObject(ofClass: URL.self) }) { | |
_ = loadableProvider.loadObject(ofClass: URL.self) { fileURL, _ in | |
if let fileURL = fileURL, fileURL.pathExtension.lowercased() == "zip" { | |
self.logger.info("Dropped \(fileURL.path)") | |
DispatchQueue.main.async { | |
importer.open(zipArchiveURL: fileURL) | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import Combine | |
/// Run a block in the background with a delay and make it cancellable. | |
/// - Parameters: | |
/// - delay: Delay in milliseconds before the background work starts | |
/// - queue: Background queue to use | |
/// - worker: Worker block to execute on queue | |
/// - completion: Completion handler executed on main thread. | |
/// - Returns: AnyCancellable token |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import SwiftUI | |
@available(iOS 13.0, *) | |
extension View { | |
/// Wraps view into an AnyView | |
func eraseToAnyView() -> AnyView { | |
AnyView(self) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ContentView.swift | |
// Shared | |
// | |
// Created by Peter Steinberger on 20.02.21. | |
// | |
import SwiftUI | |
struct SettingsGroup<Content: View>: View { |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//: A Cocoa based Playground to present user interface | |
import SwiftUI | |
import PlaygroundSupport | |
struct ContentView: View { | |
var body: some View { | |
HStack { | |
VStack { | |
HStack { |
NewerOlder