Skip to content
Merged
22 changes: 11 additions & 11 deletions Examples/Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 12 additions & 12 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ let package = Package(
),
.package(
url: "https://github.com/stackotter/swift-image-formats",
.upToNextMinor(from: "0.3.1")
.upToNextMinor(from: "0.3.2")
),
.package(
url: "https://github.com/wabiverse/swift-windowsappsdk",
Expand Down
123 changes: 123 additions & 0 deletions Sources/AppKitBackend/BaseWidget.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import AppKit

public class BaseWidget: NSView {
private var leftConstraint: NSLayoutConstraint?
private var topConstraint: NSLayoutConstraint?
private var widthConstraint: NSLayoutConstraint?
private var heightConstraint: NSLayoutConstraint?

var x = 0 {
didSet {
if x != oldValue {
updateLeftConstraint()
}
}
}

var y = 0 {
didSet {
if y != oldValue {
updateTopConstraint()
}
}
}

var width = 0 {
didSet {
if width != oldValue {
updateWidthConstraint()
}
}
}

var height = 0 {
didSet {
if height != oldValue {
updateHeightConstraint()
}
}
}

init() {
super.init(frame: .zero)

self.translatesAutoresizingMaskIntoConstraints = false
}

@available(*, unavailable)
public required init?(coder: NSCoder) {
fatalError("init(coder:) is not used for this view")
}

private func updateLeftConstraint() {
leftConstraint?.isActive = false
guard let superview else { return }
if #available(macOS 11.0, *) {
leftConstraint = self.leftAnchor.constraint(
equalTo: superview.safeAreaLayoutGuide.leftAnchor, constant: CGFloat(x))
} else {
leftConstraint = self.leftAnchor.constraint(
equalTo: superview.leftAnchor, constant: CGFloat(x))
}
leftConstraint!.isActive = true
}

private func updateTopConstraint() {
topConstraint?.isActive = false
guard let superview else { return }
if #available(macOS 11.0, *) {
topConstraint = self.topAnchor.constraint(
equalTo: superview.safeAreaLayoutGuide.topAnchor, constant: CGFloat(x))
} else {
topConstraint = self.topAnchor.constraint(
equalTo: superview.topAnchor, constant: CGFloat(x))
}
topConstraint!.isActive = true
}

private func updateWidthConstraint() {
widthConstraint?.isActive = false
widthConstraint = self.widthAnchor.constraint(equalToConstant: CGFloat(width))
widthConstraint!.isActive = true
}

private func updateHeightConstraint() {
heightConstraint?.isActive = false
heightConstraint = self.heightAnchor.constraint(equalToConstant: CGFloat(height))
heightConstraint!.isActive = true
}

public override func viewDidMoveToSuperview() {
super.viewDidMoveToSuperview()

updateLeftConstraint()
updateTopConstraint()
}
}

class WrapperWidget<View: NSView>: BaseWidget {
init(child: View) {
super.init()

self.addSubview(child)
child.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
child.topAnchor.constraint(equalTo: self.topAnchor),
child.leadingAnchor.constraint(equalTo: self.leadingAnchor),
child.bottomAnchor.constraint(equalTo: self.bottomAnchor),
child.trailingAnchor.constraint(equalTo: self.trailingAnchor),
])
}

override convenience init() {
self.init(child: View(frame: .zero))
}

var child: View {
subviews[0] as! View
}

override var intrinsicContentSize: CGSize {
child.intrinsicContentSize
}
}
Loading
Loading