Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Sources/Extensions/CALayer+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,7 +20,7 @@
import QuartzCore

extension CALayer: Layoutable {
public typealias View = CALayer
public typealias PinView = CALayer

public var superview: CALayer? {
return superlayer
Expand DownExpand Up@@ -58,7 +58,7 @@ extension CALayer: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand Down
4 changes: 2 additions & 2 deletions Sources/Extensions/NSView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import AppKit

extension NSView: Layoutable {
public typealias View = NSView
public typealias PinView = NSView

public var pin: PinLayout<NSView> {
return PinLayout(view: self, keepTransform: true)
Expand All@@ -48,7 +48,7 @@ extension NSView: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if let superview = superview, !superview.isFlipped {
var flippedRect = adjustedRect
Expand Down
8 changes: 4 additions & 4 deletions Sources/Extensions/UIView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import UIKit

extension UIView: Layoutable, SizeCalculable {
public typealias View = UIView
public typealias PinView = UIView

public var pin: PinLayout<UIView> {
return PinLayout(view: self, keepTransform: true)
Expand DownExpand Up@@ -59,7 +59,7 @@ extension UIView: Layoutable, SizeCalculable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand DownExpand Up@@ -118,8 +118,8 @@ extension UIView: AutoSizeCalculable {
}

public func setAutoSizingRect(_ rect: CGRect, margins: PEdgeInsets) {
self.autoSizingRect = Coordinates<View>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<View>.adjustRectToDisplayScale(rect.inset(by: margins))
self.autoSizingRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<PinView>.adjustRectToDisplayScale(rect.inset(by: margins))
}

public func autoSizeThatFits(_ size: CGSize, layoutClosure: () -> Void) -> CGSize {
Expand Down
24 changes: 12 additions & 12 deletions Sources/Impl/Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,58 +34,58 @@ public func _pinlayoutSetUnitTest(scale: CGFloat?) {
}
}

final class Coordinates<View: Layoutable> {
static func hCenter(_ view: View, keepTransform: Bool) -> CGFloat {
final class Coordinates<PinView: Layoutable> {
static func hCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minX + (rect.width / 2)
}

static func vCenter(_ view: View, keepTransform: Bool) -> CGFloat {
static func vCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minY + (rect.height / 2)
}

static func topLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func topLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY)
}

static func topCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func topCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY)
}

static func topRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func topRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY)
}

static func centerLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + (rect.height / 2))
}

static func center(_ view: View, keepTransform: Bool) -> CGPoint {
static func center(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + (rect.height / 2))
}

static func centerRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + (rect.height / 2))
}

static func bottomLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + rect.height)
}

static func bottomCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + rect.height)
}

static func bottomRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + rect.height)
}
Expand Down
12 changes: 6 additions & 6 deletions Sources/Impl/PinLayout+Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -361,26 +361,26 @@ extension PinLayout {
}
}

private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: View, _ referenceSuperview: View) -> CGPoint {
private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: PinView, _ referenceSuperview: PinView) -> CGPoint {
if layoutSuperview == referenceSuperview {
return point // same superview => no coordinates conversion required.
} else if referenceSuperview == layoutSuperview.superview as? View {
} else if referenceSuperview == layoutSuperview.superview as? PinView {
let layoutSuperviewRect = layoutSuperview.getRect(keepTransform: keepTransform)
return CGPoint(x: point.x - layoutSuperviewRect.origin.x,
y: point.y - layoutSuperviewRect.origin.y)
// TOOD: Handle all cases. computeCoordinates should compute coordinates using only untransformed
// coordinates, but UIView.convert(...) below use transformed coordinates!
// Currently we only support 1 and 2 levels.
} else {
return referenceSuperview.convert(point, to: layoutSuperview as? View.View)
return referenceSuperview.convert(point, to: layoutSuperview as? PinView.PinView)
}
}

internal func computeCoordinates(forAnchors anchors: [Anchor], _ context: Context) -> [CGPoint]? {
guard let layoutSuperview = layoutSuperview(context) else { return nil }
var results: [CGPoint] = []
anchors.forEach({ (anchor) in
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
if let referenceSuperview = referenceSuperview(anchor.view, context) {
results.append(computeCoordinates(anchor.point(keepTransform: keepTransform),
layoutSuperview, referenceSuperview))
Expand All@@ -392,7 +392,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: HorizontalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand All@@ -401,7 +401,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: VerticalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand Down
2 changes: 1 addition & 1 deletion Sources/Impl/PinLayout+Layouting.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,7 +45,7 @@ extension PinLayout {
isLayouted = true
}

private func apply(onView view: View) {
private func apply(onView view: PinView) {
displayLayoutWarnings()

var newRect = view.getRect(keepTransform: keepTransform)
Expand Down
14 changes: 7 additions & 7 deletions Sources/Impl/PinLayout+Warning.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,17 +36,17 @@ extension PinLayout {
}

internal func relativeEdgeContext(method: String, edge: VerticalEdge) -> String {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view)))"
}

internal func relativeEdgeContext(method: String, edge: HorizontalEdge) -> String {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view))"
}

internal func relativeAnchorContext(method: String, anchor: Anchor) -> String {
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
return "\(method)(to: .\(anchor.type.rawValue), of: \(viewDescription(anchor.view)))"
}

Expand DownExpand Up@@ -114,20 +114,20 @@ extension PinLayout {
}
}

internal func viewDescription(_ view: View) -> String {
internal func viewDescription(_ view: PinView) -> String {
let rect = view.getRect(keepTransform: keepTransform)
return "(\(viewName(view)), Frame: \(rect))"
}

internal func viewName(_ view: View) -> String {
internal func viewName(_ view: PinView) -> String {
return "\(type(of: view))"
}

internal func insetsDescription(_ insets: PEdgeInsets) -> String {
return "UIEdgeInsets(top: \(insets.top), left: \(insets.left), bottom: \(insets.bottom), right: \(insets.right))"
}

internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: View) {
internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: PinView) {
var displayText = "\n👉 \(text)"

let rect = view.getRect(keepTransform: keepTransform)
Expand All@@ -142,7 +142,7 @@ extension PinLayout {
var hierarchy: [String] = []
while let parent = currentView.superview {
hierarchy.insert("\(type(of: parent))", at: 0)
currentView = parent as! View
currentView = parent as! PinView
}
if hierarchy.count > 0 {
#if swift(>=4.1)
Expand Down
30 changes: 15 additions & 15 deletions Sources/Impl/TypesImpl.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,10 +32,10 @@ struct Size {
var height: CGFloat?
}

class EdgeListImpl<View: Layoutable>: EdgeList {
internal let view: View
class EdgeListImpl<PinView: Layoutable>: EdgeList {
internal let view: PinView

init(view: View) {
init(view: PinView) {
self.view = view
}

Expand All@@ -52,14 +52,14 @@ class EdgeListImpl<View: Layoutable>: EdgeList {
var end: HorizontalEdge { return view.isLTR() ? right : left }
}

class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
class HorizontalEdgeImpl<PinView: Layoutable>: HorizontalEdge {
enum EdgeType: String {
case left
case hCenter
case right
}

let view: View
let view: PinView
let type: EdgeType

func x(keepTransform: Bool) -> CGFloat {
Expand All@@ -72,20 +72,20 @@ class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
class VerticalEdgeImpl<PinView: Layoutable>: VerticalEdge {
enum EdgeType: String {
case top
case vCenter
case bottom
}

internal let view: View
internal let view: PinView
internal let type: EdgeType

func y(keepTransform: Bool) -> CGFloat {
Expand All@@ -99,16 +99,16 @@ class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class AnchorListImpl<View: Layoutable>: AnchorList {
internal let view: View
class AnchorListImpl<PinView: Layoutable>: AnchorList {
internal let view: PinView

internal init(view: View) {
internal init(view: PinView) {
self.view = view
}

Expand DownExpand Up@@ -143,8 +143,8 @@ enum AnchorType: String {
case bottomRight
}

class AnchorImpl<View: Layoutable>: Anchor {
let view: View
class AnchorImpl<PinView: Layoutable>: Anchor {
let view: PinView
let type: AnchorType

func point(keepTransform: Bool) -> CGPoint {
Expand All@@ -161,7 +161,7 @@ class AnchorImpl<View: Layoutable>: Anchor {
}
}

fileprivate init(view: View, type: AnchorType) {
fileprivate init(view: PinView, type: AnchorType) {
self.view = view
self.type = type
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/Layoutable+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ import Foundation

extension Layoutable {
public var anchor: AnchorList {
return AnchorListImpl(view: self as! View)
return AnchorListImpl(view: self as! PinView)
}

public var edge: EdgeList {
return EdgeListImpl(view: self as! View)
return EdgeListImpl(view: self as! PinView)
}
}
8 changes: 4 additions & 4 deletions Sources/Layoutable.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,15 +24,15 @@ import AppKit
#endif

public protocol Layoutable: AnyObject, Equatable, CustomDebugStringConvertible {
associatedtype View: Layoutable
associatedtype PinView: Layoutable

var superview: View? { get }
var subviews: [View] { get }
var superview: PinView? { get }
var subviews: [PinView] { get }

func getRect(keepTransform: Bool) -> CGRect
func setRect(_ rect: CGRect, keepTransform: Bool)

func convert(_ point: CGPoint, to view: View?) -> CGPoint
func convert(_ point: CGPoint, to view: PinView?) -> CGPoint

func isLTR() -> Bool
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Sources/Extensions/CALayer+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,7 +20,7 @@
import QuartzCore

extension CALayer: Layoutable {
public typealias View = CALayer
public typealias PinView = CALayer

public var superview: CALayer? {
return superlayer
Expand DownExpand Up@@ -58,7 +58,7 @@ extension CALayer: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand Down
4 changes: 2 additions & 2 deletions Sources/Extensions/NSView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import AppKit

extension NSView: Layoutable {
public typealias View = NSView
public typealias PinView = NSView

public var pin: PinLayout<NSView> {
return PinLayout(view: self, keepTransform: true)
Expand All@@ -48,7 +48,7 @@ extension NSView: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if let superview = superview, !superview.isFlipped {
var flippedRect = adjustedRect
Expand Down
8 changes: 4 additions & 4 deletions Sources/Extensions/UIView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import UIKit

extension UIView: Layoutable, SizeCalculable {
public typealias View = UIView
public typealias PinView = UIView

public var pin: PinLayout<UIView> {
return PinLayout(view: self, keepTransform: true)
Expand DownExpand Up@@ -59,7 +59,7 @@ extension UIView: Layoutable, SizeCalculable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand DownExpand Up@@ -118,8 +118,8 @@ extension UIView: AutoSizeCalculable {
}

public func setAutoSizingRect(_ rect: CGRect, margins: PEdgeInsets) {
self.autoSizingRect = Coordinates<View>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<View>.adjustRectToDisplayScale(rect.inset(by: margins))
self.autoSizingRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<PinView>.adjustRectToDisplayScale(rect.inset(by: margins))
}

public func autoSizeThatFits(_ size: CGSize, layoutClosure: () -> Void) -> CGSize {
Expand Down
24 changes: 12 additions & 12 deletions Sources/Impl/Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,58 +34,58 @@ public func _pinlayoutSetUnitTest(scale: CGFloat?) {
}
}

final class Coordinates<View: Layoutable> {
static func hCenter(_ view: View, keepTransform: Bool) -> CGFloat {
final class Coordinates<PinView: Layoutable> {
static func hCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minX + (rect.width / 2)
}

static func vCenter(_ view: View, keepTransform: Bool) -> CGFloat {
static func vCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minY + (rect.height / 2)
}

static func topLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func topLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY)
}

static func topCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func topCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY)
}

static func topRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func topRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY)
}

static func centerLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + (rect.height / 2))
}

static func center(_ view: View, keepTransform: Bool) -> CGPoint {
static func center(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + (rect.height / 2))
}

static func centerRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + (rect.height / 2))
}

static func bottomLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + rect.height)
}

static func bottomCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + rect.height)
}

static func bottomRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + rect.height)
}
Expand Down
12 changes: 6 additions & 6 deletions Sources/Impl/PinLayout+Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -361,26 +361,26 @@ extension PinLayout {
}
}

private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: View, _ referenceSuperview: View) -> CGPoint {
private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: PinView, _ referenceSuperview: PinView) -> CGPoint {
if layoutSuperview == referenceSuperview {
return point // same superview => no coordinates conversion required.
} else if referenceSuperview == layoutSuperview.superview as? View {
} else if referenceSuperview == layoutSuperview.superview as? PinView {
let layoutSuperviewRect = layoutSuperview.getRect(keepTransform: keepTransform)
return CGPoint(x: point.x - layoutSuperviewRect.origin.x,
y: point.y - layoutSuperviewRect.origin.y)
// TOOD: Handle all cases. computeCoordinates should compute coordinates using only untransformed
// coordinates, but UIView.convert(...) below use transformed coordinates!
// Currently we only support 1 and 2 levels.
} else {
return referenceSuperview.convert(point, to: layoutSuperview as? View.View)
return referenceSuperview.convert(point, to: layoutSuperview as? PinView.PinView)
}
}

internal func computeCoordinates(forAnchors anchors: [Anchor], _ context: Context) -> [CGPoint]? {
guard let layoutSuperview = layoutSuperview(context) else { return nil }
var results: [CGPoint] = []
anchors.forEach({ (anchor) in
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
if let referenceSuperview = referenceSuperview(anchor.view, context) {
results.append(computeCoordinates(anchor.point(keepTransform: keepTransform),
layoutSuperview, referenceSuperview))
Expand All@@ -392,7 +392,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: HorizontalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand All@@ -401,7 +401,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: VerticalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand Down
2 changes: 1 addition & 1 deletion Sources/Impl/PinLayout+Layouting.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,7 +45,7 @@ extension PinLayout {
isLayouted = true
}

private func apply(onView view: View) {
private func apply(onView view: PinView) {
displayLayoutWarnings()

var newRect = view.getRect(keepTransform: keepTransform)
Expand Down
14 changes: 7 additions & 7 deletions Sources/Impl/PinLayout+Warning.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,17 +36,17 @@ extension PinLayout {
}

internal func relativeEdgeContext(method: String, edge: VerticalEdge) -> String {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view)))"
}

internal func relativeEdgeContext(method: String, edge: HorizontalEdge) -> String {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view))"
}

internal func relativeAnchorContext(method: String, anchor: Anchor) -> String {
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
return "\(method)(to: .\(anchor.type.rawValue), of: \(viewDescription(anchor.view)))"
}

Expand DownExpand Up@@ -114,20 +114,20 @@ extension PinLayout {
}
}

internal func viewDescription(_ view: View) -> String {
internal func viewDescription(_ view: PinView) -> String {
let rect = view.getRect(keepTransform: keepTransform)
return "(\(viewName(view)), Frame: \(rect))"
}

internal func viewName(_ view: View) -> String {
internal func viewName(_ view: PinView) -> String {
return "\(type(of: view))"
}

internal func insetsDescription(_ insets: PEdgeInsets) -> String {
return "UIEdgeInsets(top: \(insets.top), left: \(insets.left), bottom: \(insets.bottom), right: \(insets.right))"
}

internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: View) {
internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: PinView) {
var displayText = "\n👉 \(text)"

let rect = view.getRect(keepTransform: keepTransform)
Expand All@@ -142,7 +142,7 @@ extension PinLayout {
var hierarchy: [String] = []
while let parent = currentView.superview {
hierarchy.insert("\(type(of: parent))", at: 0)
currentView = parent as! View
currentView = parent as! PinView
}
if hierarchy.count > 0 {
#if swift(>=4.1)
Expand Down
30 changes: 15 additions & 15 deletions Sources/Impl/TypesImpl.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,10 +32,10 @@ struct Size {
var height: CGFloat?
}

class EdgeListImpl<View: Layoutable>: EdgeList {
internal let view: View
class EdgeListImpl<PinView: Layoutable>: EdgeList {
internal let view: PinView

init(view: View) {
init(view: PinView) {
self.view = view
}

Expand All@@ -52,14 +52,14 @@ class EdgeListImpl<View: Layoutable>: EdgeList {
var end: HorizontalEdge { return view.isLTR() ? right : left }
}

class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
class HorizontalEdgeImpl<PinView: Layoutable>: HorizontalEdge {
enum EdgeType: String {
case left
case hCenter
case right
}

let view: View
let view: PinView
let type: EdgeType

func x(keepTransform: Bool) -> CGFloat {
Expand All@@ -72,20 +72,20 @@ class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
class VerticalEdgeImpl<PinView: Layoutable>: VerticalEdge {
enum EdgeType: String {
case top
case vCenter
case bottom
}

internal let view: View
internal let view: PinView
internal let type: EdgeType

func y(keepTransform: Bool) -> CGFloat {
Expand All@@ -99,16 +99,16 @@ class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class AnchorListImpl<View: Layoutable>: AnchorList {
internal let view: View
class AnchorListImpl<PinView: Layoutable>: AnchorList {
internal let view: PinView

internal init(view: View) {
internal init(view: PinView) {
self.view = view
}

Expand DownExpand Up@@ -143,8 +143,8 @@ enum AnchorType: String {
case bottomRight
}

class AnchorImpl<View: Layoutable>: Anchor {
let view: View
class AnchorImpl<PinView: Layoutable>: Anchor {
let view: PinView
let type: AnchorType

func point(keepTransform: Bool) -> CGPoint {
Expand All@@ -161,7 +161,7 @@ class AnchorImpl<View: Layoutable>: Anchor {
}
}

fileprivate init(view: View, type: AnchorType) {
fileprivate init(view: PinView, type: AnchorType) {
self.view = view
self.type = type
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/Layoutable+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ import Foundation

extension Layoutable {
public var anchor: AnchorList {
return AnchorListImpl(view: self as! View)
return AnchorListImpl(view: self as! PinView)
}

public var edge: EdgeList {
return EdgeListImpl(view: self as! View)
return EdgeListImpl(view: self as! PinView)
}
}
8 changes: 4 additions & 4 deletions Sources/Layoutable.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,15 +24,15 @@ import AppKit
#endif

public protocol Layoutable: AnyObject, Equatable, CustomDebugStringConvertible {
associatedtype View: Layoutable
associatedtype PinView: Layoutable

var superview: View? { get }
var subviews: [View] { get }
var superview: PinView? { get }
var subviews: [PinView] { get }

func getRect(keepTransform: Bool) -> CGRect
func setRect(_ rect: CGRect, keepTransform: Bool)

func convert(_ point: CGPoint, to view: View?) -> CGPoint
func convert(_ point: CGPoint, to view: PinView?) -> CGPoint

func isLTR() -> Bool
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Sources/Extensions/CALayer+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,7 +20,7 @@
import QuartzCore

extension CALayer: Layoutable {
public typealias View = CALayer
public typealias PinView = CALayer

public var superview: CALayer? {
return superlayer
Expand DownExpand Up@@ -58,7 +58,7 @@ extension CALayer: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand Down
4 changes: 2 additions & 2 deletions Sources/Extensions/NSView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import AppKit

extension NSView: Layoutable {
public typealias View = NSView
public typealias PinView = NSView

public var pin: PinLayout<NSView> {
return PinLayout(view: self, keepTransform: true)
Expand All@@ -48,7 +48,7 @@ extension NSView: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if let superview = superview, !superview.isFlipped {
var flippedRect = adjustedRect
Expand Down
8 changes: 4 additions & 4 deletions Sources/Extensions/UIView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import UIKit

extension UIView: Layoutable, SizeCalculable {
public typealias View = UIView
public typealias PinView = UIView

public var pin: PinLayout<UIView> {
return PinLayout(view: self, keepTransform: true)
Expand DownExpand Up@@ -59,7 +59,7 @@ extension UIView: Layoutable, SizeCalculable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand DownExpand Up@@ -118,8 +118,8 @@ extension UIView: AutoSizeCalculable {
}

public func setAutoSizingRect(_ rect: CGRect, margins: PEdgeInsets) {
self.autoSizingRect = Coordinates<View>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<View>.adjustRectToDisplayScale(rect.inset(by: margins))
self.autoSizingRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<PinView>.adjustRectToDisplayScale(rect.inset(by: margins))
}

public func autoSizeThatFits(_ size: CGSize, layoutClosure: () -> Void) -> CGSize {
Expand Down
24 changes: 12 additions & 12 deletions Sources/Impl/Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,58 +34,58 @@ public func _pinlayoutSetUnitTest(scale: CGFloat?) {
}
}

final class Coordinates<View: Layoutable> {
static func hCenter(_ view: View, keepTransform: Bool) -> CGFloat {
final class Coordinates<PinView: Layoutable> {
static func hCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minX + (rect.width / 2)
}

static func vCenter(_ view: View, keepTransform: Bool) -> CGFloat {
static func vCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minY + (rect.height / 2)
}

static func topLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func topLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY)
}

static func topCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func topCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY)
}

static func topRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func topRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY)
}

static func centerLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + (rect.height / 2))
}

static func center(_ view: View, keepTransform: Bool) -> CGPoint {
static func center(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + (rect.height / 2))
}

static func centerRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + (rect.height / 2))
}

static func bottomLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + rect.height)
}

static func bottomCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + rect.height)
}

static func bottomRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + rect.height)
}
Expand Down
12 changes: 6 additions & 6 deletions Sources/Impl/PinLayout+Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -361,26 +361,26 @@ extension PinLayout {
}
}

private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: View, _ referenceSuperview: View) -> CGPoint {
private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: PinView, _ referenceSuperview: PinView) -> CGPoint {
if layoutSuperview == referenceSuperview {
return point // same superview => no coordinates conversion required.
} else if referenceSuperview == layoutSuperview.superview as? View {
} else if referenceSuperview == layoutSuperview.superview as? PinView {
let layoutSuperviewRect = layoutSuperview.getRect(keepTransform: keepTransform)
return CGPoint(x: point.x - layoutSuperviewRect.origin.x,
y: point.y - layoutSuperviewRect.origin.y)
// TOOD: Handle all cases. computeCoordinates should compute coordinates using only untransformed
// coordinates, but UIView.convert(...) below use transformed coordinates!
// Currently we only support 1 and 2 levels.
} else {
return referenceSuperview.convert(point, to: layoutSuperview as? View.View)
return referenceSuperview.convert(point, to: layoutSuperview as? PinView.PinView)
}
}

internal func computeCoordinates(forAnchors anchors: [Anchor], _ context: Context) -> [CGPoint]? {
guard let layoutSuperview = layoutSuperview(context) else { return nil }
var results: [CGPoint] = []
anchors.forEach({ (anchor) in
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
if let referenceSuperview = referenceSuperview(anchor.view, context) {
results.append(computeCoordinates(anchor.point(keepTransform: keepTransform),
layoutSuperview, referenceSuperview))
Expand All@@ -392,7 +392,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: HorizontalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand All@@ -401,7 +401,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: VerticalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand Down
2 changes: 1 addition & 1 deletion Sources/Impl/PinLayout+Layouting.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,7 +45,7 @@ extension PinLayout {
isLayouted = true
}

private func apply(onView view: View) {
private func apply(onView view: PinView) {
displayLayoutWarnings()

var newRect = view.getRect(keepTransform: keepTransform)
Expand Down
14 changes: 7 additions & 7 deletions Sources/Impl/PinLayout+Warning.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,17 +36,17 @@ extension PinLayout {
}

internal func relativeEdgeContext(method: String, edge: VerticalEdge) -> String {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view)))"
}

internal func relativeEdgeContext(method: String, edge: HorizontalEdge) -> String {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view))"
}

internal func relativeAnchorContext(method: String, anchor: Anchor) -> String {
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
return "\(method)(to: .\(anchor.type.rawValue), of: \(viewDescription(anchor.view)))"
}

Expand DownExpand Up@@ -114,20 +114,20 @@ extension PinLayout {
}
}

internal func viewDescription(_ view: View) -> String {
internal func viewDescription(_ view: PinView) -> String {
let rect = view.getRect(keepTransform: keepTransform)
return "(\(viewName(view)), Frame: \(rect))"
}

internal func viewName(_ view: View) -> String {
internal func viewName(_ view: PinView) -> String {
return "\(type(of: view))"
}

internal func insetsDescription(_ insets: PEdgeInsets) -> String {
return "UIEdgeInsets(top: \(insets.top), left: \(insets.left), bottom: \(insets.bottom), right: \(insets.right))"
}

internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: View) {
internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: PinView) {
var displayText = "\n👉 \(text)"

let rect = view.getRect(keepTransform: keepTransform)
Expand All@@ -142,7 +142,7 @@ extension PinLayout {
var hierarchy: [String] = []
while let parent = currentView.superview {
hierarchy.insert("\(type(of: parent))", at: 0)
currentView = parent as! View
currentView = parent as! PinView
}
if hierarchy.count > 0 {
#if swift(>=4.1)
Expand Down
30 changes: 15 additions & 15 deletions Sources/Impl/TypesImpl.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,10 +32,10 @@ struct Size {
var height: CGFloat?
}

class EdgeListImpl<View: Layoutable>: EdgeList {
internal let view: View
class EdgeListImpl<PinView: Layoutable>: EdgeList {
internal let view: PinView

init(view: View) {
init(view: PinView) {
self.view = view
}

Expand All@@ -52,14 +52,14 @@ class EdgeListImpl<View: Layoutable>: EdgeList {
var end: HorizontalEdge { return view.isLTR() ? right : left }
}

class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
class HorizontalEdgeImpl<PinView: Layoutable>: HorizontalEdge {
enum EdgeType: String {
case left
case hCenter
case right
}

let view: View
let view: PinView
let type: EdgeType

func x(keepTransform: Bool) -> CGFloat {
Expand All@@ -72,20 +72,20 @@ class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
class VerticalEdgeImpl<PinView: Layoutable>: VerticalEdge {
enum EdgeType: String {
case top
case vCenter
case bottom
}

internal let view: View
internal let view: PinView
internal let type: EdgeType

func y(keepTransform: Bool) -> CGFloat {
Expand All@@ -99,16 +99,16 @@ class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class AnchorListImpl<View: Layoutable>: AnchorList {
internal let view: View
class AnchorListImpl<PinView: Layoutable>: AnchorList {
internal let view: PinView

internal init(view: View) {
internal init(view: PinView) {
self.view = view
}

Expand DownExpand Up@@ -143,8 +143,8 @@ enum AnchorType: String {
case bottomRight
}

class AnchorImpl<View: Layoutable>: Anchor {
let view: View
class AnchorImpl<PinView: Layoutable>: Anchor {
let view: PinView
let type: AnchorType

func point(keepTransform: Bool) -> CGPoint {
Expand All@@ -161,7 +161,7 @@ class AnchorImpl<View: Layoutable>: Anchor {
}
}

fileprivate init(view: View, type: AnchorType) {
fileprivate init(view: PinView, type: AnchorType) {
self.view = view
self.type = type
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/Layoutable+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ import Foundation

extension Layoutable {
public var anchor: AnchorList {
return AnchorListImpl(view: self as! View)
return AnchorListImpl(view: self as! PinView)
}

public var edge: EdgeList {
return EdgeListImpl(view: self as! View)
return EdgeListImpl(view: self as! PinView)
}
}
8 changes: 4 additions & 4 deletions Sources/Layoutable.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,15 +24,15 @@ import AppKit
#endif

public protocol Layoutable: AnyObject, Equatable, CustomDebugStringConvertible {
associatedtype View: Layoutable
associatedtype PinView: Layoutable

var superview: View? { get }
var subviews: [View] { get }
var superview: PinView? { get }
var subviews: [PinView] { get }

func getRect(keepTransform: Bool) -> CGRect
func setRect(_ rect: CGRect, keepTransform: Bool)

func convert(_ point: CGPoint, to view: View?) -> CGPoint
func convert(_ point: CGPoint, to view: PinView?) -> CGPoint

func isLTR() -> Bool
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Sources/Extensions/CALayer+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,7 +20,7 @@
import QuartzCore

extension CALayer: Layoutable {
public typealias View = CALayer
public typealias PinView = CALayer

public var superview: CALayer? {
return superlayer
Expand DownExpand Up@@ -58,7 +58,7 @@ extension CALayer: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand Down
4 changes: 2 additions & 2 deletions Sources/Extensions/NSView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import AppKit

extension NSView: Layoutable {
public typealias View = NSView
public typealias PinView = NSView

public var pin: PinLayout<NSView> {
return PinLayout(view: self, keepTransform: true)
Expand All@@ -48,7 +48,7 @@ extension NSView: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if let superview = superview, !superview.isFlipped {
var flippedRect = adjustedRect
Expand Down
8 changes: 4 additions & 4 deletions Sources/Extensions/UIView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import UIKit

extension UIView: Layoutable, SizeCalculable {
public typealias View = UIView
public typealias PinView = UIView

public var pin: PinLayout<UIView> {
return PinLayout(view: self, keepTransform: true)
Expand DownExpand Up@@ -59,7 +59,7 @@ extension UIView: Layoutable, SizeCalculable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand DownExpand Up@@ -118,8 +118,8 @@ extension UIView: AutoSizeCalculable {
}

public func setAutoSizingRect(_ rect: CGRect, margins: PEdgeInsets) {
self.autoSizingRect = Coordinates<View>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<View>.adjustRectToDisplayScale(rect.inset(by: margins))
self.autoSizingRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<PinView>.adjustRectToDisplayScale(rect.inset(by: margins))
}

public func autoSizeThatFits(_ size: CGSize, layoutClosure: () -> Void) -> CGSize {
Expand Down
24 changes: 12 additions & 12 deletions Sources/Impl/Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,58 +34,58 @@ public func _pinlayoutSetUnitTest(scale: CGFloat?) {
}
}

final class Coordinates<View: Layoutable> {
static func hCenter(_ view: View, keepTransform: Bool) -> CGFloat {
final class Coordinates<PinView: Layoutable> {
static func hCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minX + (rect.width / 2)
}

static func vCenter(_ view: View, keepTransform: Bool) -> CGFloat {
static func vCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minY + (rect.height / 2)
}

static func topLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func topLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY)
}

static func topCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func topCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY)
}

static func topRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func topRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY)
}

static func centerLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + (rect.height / 2))
}

static func center(_ view: View, keepTransform: Bool) -> CGPoint {
static func center(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + (rect.height / 2))
}

static func centerRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + (rect.height / 2))
}

static func bottomLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + rect.height)
}

static func bottomCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + rect.height)
}

static func bottomRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + rect.height)
}
Expand Down
12 changes: 6 additions & 6 deletions Sources/Impl/PinLayout+Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -361,26 +361,26 @@ extension PinLayout {
}
}

private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: View, _ referenceSuperview: View) -> CGPoint {
private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: PinView, _ referenceSuperview: PinView) -> CGPoint {
if layoutSuperview == referenceSuperview {
return point // same superview => no coordinates conversion required.
} else if referenceSuperview == layoutSuperview.superview as? View {
} else if referenceSuperview == layoutSuperview.superview as? PinView {
let layoutSuperviewRect = layoutSuperview.getRect(keepTransform: keepTransform)
return CGPoint(x: point.x - layoutSuperviewRect.origin.x,
y: point.y - layoutSuperviewRect.origin.y)
// TOOD: Handle all cases. computeCoordinates should compute coordinates using only untransformed
// coordinates, but UIView.convert(...) below use transformed coordinates!
// Currently we only support 1 and 2 levels.
} else {
return referenceSuperview.convert(point, to: layoutSuperview as? View.View)
return referenceSuperview.convert(point, to: layoutSuperview as? PinView.PinView)
}
}

internal func computeCoordinates(forAnchors anchors: [Anchor], _ context: Context) -> [CGPoint]? {
guard let layoutSuperview = layoutSuperview(context) else { return nil }
var results: [CGPoint] = []
anchors.forEach({ (anchor) in
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
if let referenceSuperview = referenceSuperview(anchor.view, context) {
results.append(computeCoordinates(anchor.point(keepTransform: keepTransform),
layoutSuperview, referenceSuperview))
Expand All@@ -392,7 +392,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: HorizontalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand All@@ -401,7 +401,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: VerticalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand Down
2 changes: 1 addition & 1 deletion Sources/Impl/PinLayout+Layouting.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,7 +45,7 @@ extension PinLayout {
isLayouted = true
}

private func apply(onView view: View) {
private func apply(onView view: PinView) {
displayLayoutWarnings()

var newRect = view.getRect(keepTransform: keepTransform)
Expand Down
14 changes: 7 additions & 7 deletions Sources/Impl/PinLayout+Warning.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,17 +36,17 @@ extension PinLayout {
}

internal func relativeEdgeContext(method: String, edge: VerticalEdge) -> String {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view)))"
}

internal func relativeEdgeContext(method: String, edge: HorizontalEdge) -> String {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view))"
}

internal func relativeAnchorContext(method: String, anchor: Anchor) -> String {
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
return "\(method)(to: .\(anchor.type.rawValue), of: \(viewDescription(anchor.view)))"
}

Expand DownExpand Up@@ -114,20 +114,20 @@ extension PinLayout {
}
}

internal func viewDescription(_ view: View) -> String {
internal func viewDescription(_ view: PinView) -> String {
let rect = view.getRect(keepTransform: keepTransform)
return "(\(viewName(view)), Frame: \(rect))"
}

internal func viewName(_ view: View) -> String {
internal func viewName(_ view: PinView) -> String {
return "\(type(of: view))"
}

internal func insetsDescription(_ insets: PEdgeInsets) -> String {
return "UIEdgeInsets(top: \(insets.top), left: \(insets.left), bottom: \(insets.bottom), right: \(insets.right))"
}

internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: View) {
internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: PinView) {
var displayText = "\n👉 \(text)"

let rect = view.getRect(keepTransform: keepTransform)
Expand All@@ -142,7 +142,7 @@ extension PinLayout {
var hierarchy: [String] = []
while let parent = currentView.superview {
hierarchy.insert("\(type(of: parent))", at: 0)
currentView = parent as! View
currentView = parent as! PinView
}
if hierarchy.count > 0 {
#if swift(>=4.1)
Expand Down
30 changes: 15 additions & 15 deletions Sources/Impl/TypesImpl.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,10 +32,10 @@ struct Size {
var height: CGFloat?
}

class EdgeListImpl<View: Layoutable>: EdgeList {
internal let view: View
class EdgeListImpl<PinView: Layoutable>: EdgeList {
internal let view: PinView

init(view: View) {
init(view: PinView) {
self.view = view
}

Expand All@@ -52,14 +52,14 @@ class EdgeListImpl<View: Layoutable>: EdgeList {
var end: HorizontalEdge { return view.isLTR() ? right : left }
}

class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
class HorizontalEdgeImpl<PinView: Layoutable>: HorizontalEdge {
enum EdgeType: String {
case left
case hCenter
case right
}

let view: View
let view: PinView
let type: EdgeType

func x(keepTransform: Bool) -> CGFloat {
Expand All@@ -72,20 +72,20 @@ class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
class VerticalEdgeImpl<PinView: Layoutable>: VerticalEdge {
enum EdgeType: String {
case top
case vCenter
case bottom
}

internal let view: View
internal let view: PinView
internal let type: EdgeType

func y(keepTransform: Bool) -> CGFloat {
Expand All@@ -99,16 +99,16 @@ class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class AnchorListImpl<View: Layoutable>: AnchorList {
internal let view: View
class AnchorListImpl<PinView: Layoutable>: AnchorList {
internal let view: PinView

internal init(view: View) {
internal init(view: PinView) {
self.view = view
}

Expand DownExpand Up@@ -143,8 +143,8 @@ enum AnchorType: String {
case bottomRight
}

class AnchorImpl<View: Layoutable>: Anchor {
let view: View
class AnchorImpl<PinView: Layoutable>: Anchor {
let view: PinView
let type: AnchorType

func point(keepTransform: Bool) -> CGPoint {
Expand All@@ -161,7 +161,7 @@ class AnchorImpl<View: Layoutable>: Anchor {
}
}

fileprivate init(view: View, type: AnchorType) {
fileprivate init(view: PinView, type: AnchorType) {
self.view = view
self.type = type
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/Layoutable+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ import Foundation

extension Layoutable {
public var anchor: AnchorList {
return AnchorListImpl(view: self as! View)
return AnchorListImpl(view: self as! PinView)
}

public var edge: EdgeList {
return EdgeListImpl(view: self as! View)
return EdgeListImpl(view: self as! PinView)
}
}
8 changes: 4 additions & 4 deletions Sources/Layoutable.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,15 +24,15 @@ import AppKit
#endif

public protocol Layoutable: AnyObject, Equatable, CustomDebugStringConvertible {
associatedtype View: Layoutable
associatedtype PinView: Layoutable

var superview: View? { get }
var subviews: [View] { get }
var superview: PinView? { get }
var subviews: [PinView] { get }

func getRect(keepTransform: Bool) -> CGRect
func setRect(_ rect: CGRect, keepTransform: Bool)

func convert(_ point: CGPoint, to view: View?) -> CGPoint
func convert(_ point: CGPoint, to view: PinView?) -> CGPoint

func isLTR() -> Bool
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Sources/Extensions/CALayer+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,7 +20,7 @@
import QuartzCore

extension CALayer: Layoutable {
public typealias View = CALayer
public typealias PinView = CALayer

public var superview: CALayer? {
return superlayer
Expand DownExpand Up@@ -58,7 +58,7 @@ extension CALayer: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand Down
4 changes: 2 additions & 2 deletions Sources/Extensions/NSView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import AppKit

extension NSView: Layoutable {
public typealias View = NSView
public typealias PinView = NSView

public var pin: PinLayout<NSView> {
return PinLayout(view: self, keepTransform: true)
Expand All@@ -48,7 +48,7 @@ extension NSView: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if let superview = superview, !superview.isFlipped {
var flippedRect = adjustedRect
Expand Down
8 changes: 4 additions & 4 deletions Sources/Extensions/UIView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import UIKit

extension UIView: Layoutable, SizeCalculable {
public typealias View = UIView
public typealias PinView = UIView

public var pin: PinLayout<UIView> {
return PinLayout(view: self, keepTransform: true)
Expand DownExpand Up@@ -59,7 +59,7 @@ extension UIView: Layoutable, SizeCalculable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand DownExpand Up@@ -118,8 +118,8 @@ extension UIView: AutoSizeCalculable {
}

public func setAutoSizingRect(_ rect: CGRect, margins: PEdgeInsets) {
self.autoSizingRect = Coordinates<View>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<View>.adjustRectToDisplayScale(rect.inset(by: margins))
self.autoSizingRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<PinView>.adjustRectToDisplayScale(rect.inset(by: margins))
}

public func autoSizeThatFits(_ size: CGSize, layoutClosure: () -> Void) -> CGSize {
Expand Down
24 changes: 12 additions & 12 deletions Sources/Impl/Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,58 +34,58 @@ public func _pinlayoutSetUnitTest(scale: CGFloat?) {
}
}

final class Coordinates<View: Layoutable> {
static func hCenter(_ view: View, keepTransform: Bool) -> CGFloat {
final class Coordinates<PinView: Layoutable> {
static func hCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minX + (rect.width / 2)
}

static func vCenter(_ view: View, keepTransform: Bool) -> CGFloat {
static func vCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minY + (rect.height / 2)
}

static func topLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func topLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY)
}

static func topCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func topCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY)
}

static func topRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func topRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY)
}

static func centerLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + (rect.height / 2))
}

static func center(_ view: View, keepTransform: Bool) -> CGPoint {
static func center(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + (rect.height / 2))
}

static func centerRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + (rect.height / 2))
}

static func bottomLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + rect.height)
}

static func bottomCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + rect.height)
}

static func bottomRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + rect.height)
}
Expand Down
12 changes: 6 additions & 6 deletions Sources/Impl/PinLayout+Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -361,26 +361,26 @@ extension PinLayout {
}
}

private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: View, _ referenceSuperview: View) -> CGPoint {
private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: PinView, _ referenceSuperview: PinView) -> CGPoint {
if layoutSuperview == referenceSuperview {
return point // same superview => no coordinates conversion required.
} else if referenceSuperview == layoutSuperview.superview as? View {
} else if referenceSuperview == layoutSuperview.superview as? PinView {
let layoutSuperviewRect = layoutSuperview.getRect(keepTransform: keepTransform)
return CGPoint(x: point.x - layoutSuperviewRect.origin.x,
y: point.y - layoutSuperviewRect.origin.y)
// TOOD: Handle all cases. computeCoordinates should compute coordinates using only untransformed
// coordinates, but UIView.convert(...) below use transformed coordinates!
// Currently we only support 1 and 2 levels.
} else {
return referenceSuperview.convert(point, to: layoutSuperview as? View.View)
return referenceSuperview.convert(point, to: layoutSuperview as? PinView.PinView)
}
}

internal func computeCoordinates(forAnchors anchors: [Anchor], _ context: Context) -> [CGPoint]? {
guard let layoutSuperview = layoutSuperview(context) else { return nil }
var results: [CGPoint] = []
anchors.forEach({ (anchor) in
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
if let referenceSuperview = referenceSuperview(anchor.view, context) {
results.append(computeCoordinates(anchor.point(keepTransform: keepTransform),
layoutSuperview, referenceSuperview))
Expand All@@ -392,7 +392,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: HorizontalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand All@@ -401,7 +401,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: VerticalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand Down
2 changes: 1 addition & 1 deletion Sources/Impl/PinLayout+Layouting.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,7 +45,7 @@ extension PinLayout {
isLayouted = true
}

private func apply(onView view: View) {
private func apply(onView view: PinView) {
displayLayoutWarnings()

var newRect = view.getRect(keepTransform: keepTransform)
Expand Down
14 changes: 7 additions & 7 deletions Sources/Impl/PinLayout+Warning.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,17 +36,17 @@ extension PinLayout {
}

internal func relativeEdgeContext(method: String, edge: VerticalEdge) -> String {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view)))"
}

internal func relativeEdgeContext(method: String, edge: HorizontalEdge) -> String {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view))"
}

internal func relativeAnchorContext(method: String, anchor: Anchor) -> String {
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
return "\(method)(to: .\(anchor.type.rawValue), of: \(viewDescription(anchor.view)))"
}

Expand DownExpand Up@@ -114,20 +114,20 @@ extension PinLayout {
}
}

internal func viewDescription(_ view: View) -> String {
internal func viewDescription(_ view: PinView) -> String {
let rect = view.getRect(keepTransform: keepTransform)
return "(\(viewName(view)), Frame: \(rect))"
}

internal func viewName(_ view: View) -> String {
internal func viewName(_ view: PinView) -> String {
return "\(type(of: view))"
}

internal func insetsDescription(_ insets: PEdgeInsets) -> String {
return "UIEdgeInsets(top: \(insets.top), left: \(insets.left), bottom: \(insets.bottom), right: \(insets.right))"
}

internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: View) {
internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: PinView) {
var displayText = "\n👉 \(text)"

let rect = view.getRect(keepTransform: keepTransform)
Expand All@@ -142,7 +142,7 @@ extension PinLayout {
var hierarchy: [String] = []
while let parent = currentView.superview {
hierarchy.insert("\(type(of: parent))", at: 0)
currentView = parent as! View
currentView = parent as! PinView
}
if hierarchy.count > 0 {
#if swift(>=4.1)
Expand Down
30 changes: 15 additions & 15 deletions Sources/Impl/TypesImpl.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,10 +32,10 @@ struct Size {
var height: CGFloat?
}

class EdgeListImpl<View: Layoutable>: EdgeList {
internal let view: View
class EdgeListImpl<PinView: Layoutable>: EdgeList {
internal let view: PinView

init(view: View) {
init(view: PinView) {
self.view = view
}

Expand All@@ -52,14 +52,14 @@ class EdgeListImpl<View: Layoutable>: EdgeList {
var end: HorizontalEdge { return view.isLTR() ? right : left }
}

class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
class HorizontalEdgeImpl<PinView: Layoutable>: HorizontalEdge {
enum EdgeType: String {
case left
case hCenter
case right
}

let view: View
let view: PinView
let type: EdgeType

func x(keepTransform: Bool) -> CGFloat {
Expand All@@ -72,20 +72,20 @@ class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
class VerticalEdgeImpl<PinView: Layoutable>: VerticalEdge {
enum EdgeType: String {
case top
case vCenter
case bottom
}

internal let view: View
internal let view: PinView
internal let type: EdgeType

func y(keepTransform: Bool) -> CGFloat {
Expand All@@ -99,16 +99,16 @@ class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class AnchorListImpl<View: Layoutable>: AnchorList {
internal let view: View
class AnchorListImpl<PinView: Layoutable>: AnchorList {
internal let view: PinView

internal init(view: View) {
internal init(view: PinView) {
self.view = view
}

Expand DownExpand Up@@ -143,8 +143,8 @@ enum AnchorType: String {
case bottomRight
}

class AnchorImpl<View: Layoutable>: Anchor {
let view: View
class AnchorImpl<PinView: Layoutable>: Anchor {
let view: PinView
let type: AnchorType

func point(keepTransform: Bool) -> CGPoint {
Expand All@@ -161,7 +161,7 @@ class AnchorImpl<View: Layoutable>: Anchor {
}
}

fileprivate init(view: View, type: AnchorType) {
fileprivate init(view: PinView, type: AnchorType) {
self.view = view
self.type = type
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/Layoutable+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ import Foundation

extension Layoutable {
public var anchor: AnchorList {
return AnchorListImpl(view: self as! View)
return AnchorListImpl(view: self as! PinView)
}

public var edge: EdgeList {
return EdgeListImpl(view: self as! View)
return EdgeListImpl(view: self as! PinView)
}
}
8 changes: 4 additions & 4 deletions Sources/Layoutable.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,15 +24,15 @@ import AppKit
#endif

public protocol Layoutable: AnyObject, Equatable, CustomDebugStringConvertible {
associatedtype View: Layoutable
associatedtype PinView: Layoutable

var superview: View? { get }
var subviews: [View] { get }
var superview: PinView? { get }
var subviews: [PinView] { get }

func getRect(keepTransform: Bool) -> CGRect
func setRect(_ rect: CGRect, keepTransform: Bool)

func convert(_ point: CGPoint, to view: View?) -> CGPoint
func convert(_ point: CGPoint, to view: PinView?) -> CGPoint

func isLTR() -> Bool
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Sources/Extensions/CALayer+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,7 +20,7 @@
import QuartzCore

extension CALayer: Layoutable {
public typealias View = CALayer
public typealias PinView = CALayer

public var superview: CALayer? {
return superlayer
Expand DownExpand Up@@ -58,7 +58,7 @@ extension CALayer: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand Down
4 changes: 2 additions & 2 deletions Sources/Extensions/NSView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import AppKit

extension NSView: Layoutable {
public typealias View = NSView
public typealias PinView = NSView

public var pin: PinLayout<NSView> {
return PinLayout(view: self, keepTransform: true)
Expand All@@ -48,7 +48,7 @@ extension NSView: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if let superview = superview, !superview.isFlipped {
var flippedRect = adjustedRect
Expand Down
8 changes: 4 additions & 4 deletions Sources/Extensions/UIView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import UIKit

extension UIView: Layoutable, SizeCalculable {
public typealias View = UIView
public typealias PinView = UIView

public var pin: PinLayout<UIView> {
return PinLayout(view: self, keepTransform: true)
Expand DownExpand Up@@ -59,7 +59,7 @@ extension UIView: Layoutable, SizeCalculable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand DownExpand Up@@ -118,8 +118,8 @@ extension UIView: AutoSizeCalculable {
}

public func setAutoSizingRect(_ rect: CGRect, margins: PEdgeInsets) {
self.autoSizingRect = Coordinates<View>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<View>.adjustRectToDisplayScale(rect.inset(by: margins))
self.autoSizingRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<PinView>.adjustRectToDisplayScale(rect.inset(by: margins))
}

public func autoSizeThatFits(_ size: CGSize, layoutClosure: () -> Void) -> CGSize {
Expand Down
24 changes: 12 additions & 12 deletions Sources/Impl/Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,58 +34,58 @@ public func _pinlayoutSetUnitTest(scale: CGFloat?) {
}
}

final class Coordinates<View: Layoutable> {
static func hCenter(_ view: View, keepTransform: Bool) -> CGFloat {
final class Coordinates<PinView: Layoutable> {
static func hCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minX + (rect.width / 2)
}

static func vCenter(_ view: View, keepTransform: Bool) -> CGFloat {
static func vCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minY + (rect.height / 2)
}

static func topLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func topLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY)
}

static func topCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func topCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY)
}

static func topRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func topRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY)
}

static func centerLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + (rect.height / 2))
}

static func center(_ view: View, keepTransform: Bool) -> CGPoint {
static func center(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + (rect.height / 2))
}

static func centerRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + (rect.height / 2))
}

static func bottomLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + rect.height)
}

static func bottomCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + rect.height)
}

static func bottomRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + rect.height)
}
Expand Down
12 changes: 6 additions & 6 deletions Sources/Impl/PinLayout+Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -361,26 +361,26 @@ extension PinLayout {
}
}

private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: View, _ referenceSuperview: View) -> CGPoint {
private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: PinView, _ referenceSuperview: PinView) -> CGPoint {
if layoutSuperview == referenceSuperview {
return point // same superview => no coordinates conversion required.
} else if referenceSuperview == layoutSuperview.superview as? View {
} else if referenceSuperview == layoutSuperview.superview as? PinView {
let layoutSuperviewRect = layoutSuperview.getRect(keepTransform: keepTransform)
return CGPoint(x: point.x - layoutSuperviewRect.origin.x,
y: point.y - layoutSuperviewRect.origin.y)
// TOOD: Handle all cases. computeCoordinates should compute coordinates using only untransformed
// coordinates, but UIView.convert(...) below use transformed coordinates!
// Currently we only support 1 and 2 levels.
} else {
return referenceSuperview.convert(point, to: layoutSuperview as? View.View)
return referenceSuperview.convert(point, to: layoutSuperview as? PinView.PinView)
}
}

internal func computeCoordinates(forAnchors anchors: [Anchor], _ context: Context) -> [CGPoint]? {
guard let layoutSuperview = layoutSuperview(context) else { return nil }
var results: [CGPoint] = []
anchors.forEach({ (anchor) in
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
if let referenceSuperview = referenceSuperview(anchor.view, context) {
results.append(computeCoordinates(anchor.point(keepTransform: keepTransform),
layoutSuperview, referenceSuperview))
Expand All@@ -392,7 +392,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: HorizontalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand All@@ -401,7 +401,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: VerticalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand Down
2 changes: 1 addition & 1 deletion Sources/Impl/PinLayout+Layouting.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,7 +45,7 @@ extension PinLayout {
isLayouted = true
}

private func apply(onView view: View) {
private func apply(onView view: PinView) {
displayLayoutWarnings()

var newRect = view.getRect(keepTransform: keepTransform)
Expand Down
14 changes: 7 additions & 7 deletions Sources/Impl/PinLayout+Warning.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,17 +36,17 @@ extension PinLayout {
}

internal func relativeEdgeContext(method: String, edge: VerticalEdge) -> String {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view)))"
}

internal func relativeEdgeContext(method: String, edge: HorizontalEdge) -> String {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view))"
}

internal func relativeAnchorContext(method: String, anchor: Anchor) -> String {
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
return "\(method)(to: .\(anchor.type.rawValue), of: \(viewDescription(anchor.view)))"
}

Expand DownExpand Up@@ -114,20 +114,20 @@ extension PinLayout {
}
}

internal func viewDescription(_ view: View) -> String {
internal func viewDescription(_ view: PinView) -> String {
let rect = view.getRect(keepTransform: keepTransform)
return "(\(viewName(view)), Frame: \(rect))"
}

internal func viewName(_ view: View) -> String {
internal func viewName(_ view: PinView) -> String {
return "\(type(of: view))"
}

internal func insetsDescription(_ insets: PEdgeInsets) -> String {
return "UIEdgeInsets(top: \(insets.top), left: \(insets.left), bottom: \(insets.bottom), right: \(insets.right))"
}

internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: View) {
internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: PinView) {
var displayText = "\n👉 \(text)"

let rect = view.getRect(keepTransform: keepTransform)
Expand All@@ -142,7 +142,7 @@ extension PinLayout {
var hierarchy: [String] = []
while let parent = currentView.superview {
hierarchy.insert("\(type(of: parent))", at: 0)
currentView = parent as! View
currentView = parent as! PinView
}
if hierarchy.count > 0 {
#if swift(>=4.1)
Expand Down
30 changes: 15 additions & 15 deletions Sources/Impl/TypesImpl.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,10 +32,10 @@ struct Size {
var height: CGFloat?
}

class EdgeListImpl<View: Layoutable>: EdgeList {
internal let view: View
class EdgeListImpl<PinView: Layoutable>: EdgeList {
internal let view: PinView

init(view: View) {
init(view: PinView) {
self.view = view
}

Expand All@@ -52,14 +52,14 @@ class EdgeListImpl<View: Layoutable>: EdgeList {
var end: HorizontalEdge { return view.isLTR() ? right : left }
}

class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
class HorizontalEdgeImpl<PinView: Layoutable>: HorizontalEdge {
enum EdgeType: String {
case left
case hCenter
case right
}

let view: View
let view: PinView
let type: EdgeType

func x(keepTransform: Bool) -> CGFloat {
Expand All@@ -72,20 +72,20 @@ class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
class VerticalEdgeImpl<PinView: Layoutable>: VerticalEdge {
enum EdgeType: String {
case top
case vCenter
case bottom
}

internal let view: View
internal let view: PinView
internal let type: EdgeType

func y(keepTransform: Bool) -> CGFloat {
Expand All@@ -99,16 +99,16 @@ class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class AnchorListImpl<View: Layoutable>: AnchorList {
internal let view: View
class AnchorListImpl<PinView: Layoutable>: AnchorList {
internal let view: PinView

internal init(view: View) {
internal init(view: PinView) {
self.view = view
}

Expand DownExpand Up@@ -143,8 +143,8 @@ enum AnchorType: String {
case bottomRight
}

class AnchorImpl<View: Layoutable>: Anchor {
let view: View
class AnchorImpl<PinView: Layoutable>: Anchor {
let view: PinView
let type: AnchorType

func point(keepTransform: Bool) -> CGPoint {
Expand All@@ -161,7 +161,7 @@ class AnchorImpl<View: Layoutable>: Anchor {
}
}

fileprivate init(view: View, type: AnchorType) {
fileprivate init(view: PinView, type: AnchorType) {
self.view = view
self.type = type
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/Layoutable+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ import Foundation

extension Layoutable {
public var anchor: AnchorList {
return AnchorListImpl(view: self as! View)
return AnchorListImpl(view: self as! PinView)
}

public var edge: EdgeList {
return EdgeListImpl(view: self as! View)
return EdgeListImpl(view: self as! PinView)
}
}
8 changes: 4 additions & 4 deletions Sources/Layoutable.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,15 +24,15 @@ import AppKit
#endif

public protocol Layoutable: AnyObject, Equatable, CustomDebugStringConvertible {
associatedtype View: Layoutable
associatedtype PinView: Layoutable

var superview: View? { get }
var subviews: [View] { get }
var superview: PinView? { get }
var subviews: [PinView] { get }

func getRect(keepTransform: Bool) -> CGRect
func setRect(_ rect: CGRect, keepTransform: Bool)

func convert(_ point: CGPoint, to view: View?) -> CGPoint
func convert(_ point: CGPoint, to view: PinView?) -> CGPoint

func isLTR() -> Bool
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Sources/Extensions/CALayer+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,7 +20,7 @@
import QuartzCore

extension CALayer: Layoutable {
public typealias View = CALayer
public typealias PinView = CALayer

public var superview: CALayer? {
return superlayer
Expand DownExpand Up@@ -58,7 +58,7 @@ extension CALayer: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand Down
4 changes: 2 additions & 2 deletions Sources/Extensions/NSView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import AppKit

extension NSView: Layoutable {
public typealias View = NSView
public typealias PinView = NSView

public var pin: PinLayout<NSView> {
return PinLayout(view: self, keepTransform: true)
Expand All@@ -48,7 +48,7 @@ extension NSView: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if let superview = superview, !superview.isFlipped {
var flippedRect = adjustedRect
Expand Down
8 changes: 4 additions & 4 deletions Sources/Extensions/UIView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import UIKit

extension UIView: Layoutable, SizeCalculable {
public typealias View = UIView
public typealias PinView = UIView

public var pin: PinLayout<UIView> {
return PinLayout(view: self, keepTransform: true)
Expand DownExpand Up@@ -59,7 +59,7 @@ extension UIView: Layoutable, SizeCalculable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand DownExpand Up@@ -118,8 +118,8 @@ extension UIView: AutoSizeCalculable {
}

public func setAutoSizingRect(_ rect: CGRect, margins: PEdgeInsets) {
self.autoSizingRect = Coordinates<View>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<View>.adjustRectToDisplayScale(rect.inset(by: margins))
self.autoSizingRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<PinView>.adjustRectToDisplayScale(rect.inset(by: margins))
}

public func autoSizeThatFits(_ size: CGSize, layoutClosure: () -> Void) -> CGSize {
Expand Down
24 changes: 12 additions & 12 deletions Sources/Impl/Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,58 +34,58 @@ public func _pinlayoutSetUnitTest(scale: CGFloat?) {
}
}

final class Coordinates<View: Layoutable> {
static func hCenter(_ view: View, keepTransform: Bool) -> CGFloat {
final class Coordinates<PinView: Layoutable> {
static func hCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minX + (rect.width / 2)
}

static func vCenter(_ view: View, keepTransform: Bool) -> CGFloat {
static func vCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minY + (rect.height / 2)
}

static func topLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func topLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY)
}

static func topCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func topCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY)
}

static func topRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func topRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY)
}

static func centerLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + (rect.height / 2))
}

static func center(_ view: View, keepTransform: Bool) -> CGPoint {
static func center(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + (rect.height / 2))
}

static func centerRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + (rect.height / 2))
}

static func bottomLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + rect.height)
}

static func bottomCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + rect.height)
}

static func bottomRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + rect.height)
}
Expand Down
12 changes: 6 additions & 6 deletions Sources/Impl/PinLayout+Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -361,26 +361,26 @@ extension PinLayout {
}
}

private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: View, _ referenceSuperview: View) -> CGPoint {
private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: PinView, _ referenceSuperview: PinView) -> CGPoint {
if layoutSuperview == referenceSuperview {
return point // same superview => no coordinates conversion required.
} else if referenceSuperview == layoutSuperview.superview as? View {
} else if referenceSuperview == layoutSuperview.superview as? PinView {
let layoutSuperviewRect = layoutSuperview.getRect(keepTransform: keepTransform)
return CGPoint(x: point.x - layoutSuperviewRect.origin.x,
y: point.y - layoutSuperviewRect.origin.y)
// TOOD: Handle all cases. computeCoordinates should compute coordinates using only untransformed
// coordinates, but UIView.convert(...) below use transformed coordinates!
// Currently we only support 1 and 2 levels.
} else {
return referenceSuperview.convert(point, to: layoutSuperview as? View.View)
return referenceSuperview.convert(point, to: layoutSuperview as? PinView.PinView)
}
}

internal func computeCoordinates(forAnchors anchors: [Anchor], _ context: Context) -> [CGPoint]? {
guard let layoutSuperview = layoutSuperview(context) else { return nil }
var results: [CGPoint] = []
anchors.forEach({ (anchor) in
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
if let referenceSuperview = referenceSuperview(anchor.view, context) {
results.append(computeCoordinates(anchor.point(keepTransform: keepTransform),
layoutSuperview, referenceSuperview))
Expand All@@ -392,7 +392,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: HorizontalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand All@@ -401,7 +401,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: VerticalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand Down
2 changes: 1 addition & 1 deletion Sources/Impl/PinLayout+Layouting.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,7 +45,7 @@ extension PinLayout {
isLayouted = true
}

private func apply(onView view: View) {
private func apply(onView view: PinView) {
displayLayoutWarnings()

var newRect = view.getRect(keepTransform: keepTransform)
Expand Down
14 changes: 7 additions & 7 deletions Sources/Impl/PinLayout+Warning.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,17 +36,17 @@ extension PinLayout {
}

internal func relativeEdgeContext(method: String, edge: VerticalEdge) -> String {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view)))"
}

internal func relativeEdgeContext(method: String, edge: HorizontalEdge) -> String {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view))"
}

internal func relativeAnchorContext(method: String, anchor: Anchor) -> String {
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
return "\(method)(to: .\(anchor.type.rawValue), of: \(viewDescription(anchor.view)))"
}

Expand DownExpand Up@@ -114,20 +114,20 @@ extension PinLayout {
}
}

internal func viewDescription(_ view: View) -> String {
internal func viewDescription(_ view: PinView) -> String {
let rect = view.getRect(keepTransform: keepTransform)
return "(\(viewName(view)), Frame: \(rect))"
}

internal func viewName(_ view: View) -> String {
internal func viewName(_ view: PinView) -> String {
return "\(type(of: view))"
}

internal func insetsDescription(_ insets: PEdgeInsets) -> String {
return "UIEdgeInsets(top: \(insets.top), left: \(insets.left), bottom: \(insets.bottom), right: \(insets.right))"
}

internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: View) {
internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: PinView) {
var displayText = "\n👉 \(text)"

let rect = view.getRect(keepTransform: keepTransform)
Expand All@@ -142,7 +142,7 @@ extension PinLayout {
var hierarchy: [String] = []
while let parent = currentView.superview {
hierarchy.insert("\(type(of: parent))", at: 0)
currentView = parent as! View
currentView = parent as! PinView
}
if hierarchy.count > 0 {
#if swift(>=4.1)
Expand Down
30 changes: 15 additions & 15 deletions Sources/Impl/TypesImpl.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,10 +32,10 @@ struct Size {
var height: CGFloat?
}

class EdgeListImpl<View: Layoutable>: EdgeList {
internal let view: View
class EdgeListImpl<PinView: Layoutable>: EdgeList {
internal let view: PinView

init(view: View) {
init(view: PinView) {
self.view = view
}

Expand All@@ -52,14 +52,14 @@ class EdgeListImpl<View: Layoutable>: EdgeList {
var end: HorizontalEdge { return view.isLTR() ? right : left }
}

class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
class HorizontalEdgeImpl<PinView: Layoutable>: HorizontalEdge {
enum EdgeType: String {
case left
case hCenter
case right
}

let view: View
let view: PinView
let type: EdgeType

func x(keepTransform: Bool) -> CGFloat {
Expand All@@ -72,20 +72,20 @@ class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
class VerticalEdgeImpl<PinView: Layoutable>: VerticalEdge {
enum EdgeType: String {
case top
case vCenter
case bottom
}

internal let view: View
internal let view: PinView
internal let type: EdgeType

func y(keepTransform: Bool) -> CGFloat {
Expand All@@ -99,16 +99,16 @@ class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class AnchorListImpl<View: Layoutable>: AnchorList {
internal let view: View
class AnchorListImpl<PinView: Layoutable>: AnchorList {
internal let view: PinView

internal init(view: View) {
internal init(view: PinView) {
self.view = view
}

Expand DownExpand Up@@ -143,8 +143,8 @@ enum AnchorType: String {
case bottomRight
}

class AnchorImpl<View: Layoutable>: Anchor {
let view: View
class AnchorImpl<PinView: Layoutable>: Anchor {
let view: PinView
let type: AnchorType

func point(keepTransform: Bool) -> CGPoint {
Expand All@@ -161,7 +161,7 @@ class AnchorImpl<View: Layoutable>: Anchor {
}
}

fileprivate init(view: View, type: AnchorType) {
fileprivate init(view: PinView, type: AnchorType) {
self.view = view
self.type = type
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/Layoutable+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ import Foundation

extension Layoutable {
public var anchor: AnchorList {
return AnchorListImpl(view: self as! View)
return AnchorListImpl(view: self as! PinView)
}

public var edge: EdgeList {
return EdgeListImpl(view: self as! View)
return EdgeListImpl(view: self as! PinView)
}
}
8 changes: 4 additions & 4 deletions Sources/Layoutable.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,15 +24,15 @@ import AppKit
#endif

public protocol Layoutable: AnyObject, Equatable, CustomDebugStringConvertible {
associatedtype View: Layoutable
associatedtype PinView: Layoutable

var superview: View? { get }
var subviews: [View] { get }
var superview: PinView? { get }
var subviews: [PinView] { get }

func getRect(keepTransform: Bool) -> CGRect
func setRect(_ rect: CGRect, keepTransform: Bool)

func convert(_ point: CGPoint, to view: View?) -> CGPoint
func convert(_ point: CGPoint, to view: PinView?) -> CGPoint

func isLTR() -> Bool
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Sources/Extensions/CALayer+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,7 +20,7 @@
import QuartzCore

extension CALayer: Layoutable {
public typealias View = CALayer
public typealias PinView = CALayer

public var superview: CALayer? {
return superlayer
Expand DownExpand Up@@ -58,7 +58,7 @@ extension CALayer: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand Down
4 changes: 2 additions & 2 deletions Sources/Extensions/NSView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import AppKit

extension NSView: Layoutable {
public typealias View = NSView
public typealias PinView = NSView

public var pin: PinLayout<NSView> {
return PinLayout(view: self, keepTransform: true)
Expand All@@ -48,7 +48,7 @@ extension NSView: Layoutable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if let superview = superview, !superview.isFlipped {
var flippedRect = adjustedRect
Expand Down
8 changes: 4 additions & 4 deletions Sources/Extensions/UIView+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ import Foundation
import UIKit

extension UIView: Layoutable, SizeCalculable {
public typealias View = UIView
public typealias PinView = UIView

public var pin: PinLayout<UIView> {
return PinLayout(view: self, keepTransform: true)
Expand DownExpand Up@@ -59,7 +59,7 @@ extension UIView: Layoutable, SizeCalculable {
}

public func setRect(_ rect: CGRect, keepTransform: Bool) {
let adjustedRect = Coordinates<View>.adjustRectToDisplayScale(rect)
let adjustedRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)

if keepTransform {
/*
Expand DownExpand Up@@ -118,8 +118,8 @@ extension UIView: AutoSizeCalculable {
}

public func setAutoSizingRect(_ rect: CGRect, margins: PEdgeInsets) {
self.autoSizingRect = Coordinates<View>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<View>.adjustRectToDisplayScale(rect.inset(by: margins))
self.autoSizingRect = Coordinates<PinView>.adjustRectToDisplayScale(rect)
self.autoSizingRectWithMargins = Coordinates<PinView>.adjustRectToDisplayScale(rect.inset(by: margins))
}

public func autoSizeThatFits(_ size: CGSize, layoutClosure: () -> Void) -> CGSize {
Expand Down
24 changes: 12 additions & 12 deletions Sources/Impl/Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,58 +34,58 @@ public func _pinlayoutSetUnitTest(scale: CGFloat?) {
}
}

final class Coordinates<View: Layoutable> {
static func hCenter(_ view: View, keepTransform: Bool) -> CGFloat {
final class Coordinates<PinView: Layoutable> {
static func hCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minX + (rect.width / 2)
}

static func vCenter(_ view: View, keepTransform: Bool) -> CGFloat {
static func vCenter(_ view: PinView, keepTransform: Bool) -> CGFloat {
let rect = view.getRect(keepTransform: keepTransform)
return rect.minY + (rect.height / 2)
}

static func topLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func topLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY)
}

static func topCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func topCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY)
}

static func topRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func topRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY)
}

static func centerLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + (rect.height / 2))
}

static func center(_ view: View, keepTransform: Bool) -> CGPoint {
static func center(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + (rect.height / 2))
}

static func centerRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func centerRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + (rect.height / 2))
}

static func bottomLeft(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomLeft(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX, y: rect.minY + rect.height)
}

static func bottomCenter(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomCenter(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + (rect.width / 2), y: rect.minY + rect.height)
}

static func bottomRight(_ view: View, keepTransform: Bool) -> CGPoint {
static func bottomRight(_ view: PinView, keepTransform: Bool) -> CGPoint {
let rect = view.getRect(keepTransform: keepTransform)
return CGPoint(x: rect.minX + rect.width, y: rect.minY + rect.height)
}
Expand Down
12 changes: 6 additions & 6 deletions Sources/Impl/PinLayout+Coordinates.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -361,26 +361,26 @@ extension PinLayout {
}
}

private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: View, _ referenceSuperview: View) -> CGPoint {
private func computeCoordinates(_ point: CGPoint, _ layoutSuperview: PinView, _ referenceSuperview: PinView) -> CGPoint {
if layoutSuperview == referenceSuperview {
return point // same superview => no coordinates conversion required.
} else if referenceSuperview == layoutSuperview.superview as? View {
} else if referenceSuperview == layoutSuperview.superview as? PinView {
let layoutSuperviewRect = layoutSuperview.getRect(keepTransform: keepTransform)
return CGPoint(x: point.x - layoutSuperviewRect.origin.x,
y: point.y - layoutSuperviewRect.origin.y)
// TOOD: Handle all cases. computeCoordinates should compute coordinates using only untransformed
// coordinates, but UIView.convert(...) below use transformed coordinates!
// Currently we only support 1 and 2 levels.
} else {
return referenceSuperview.convert(point, to: layoutSuperview as? View.View)
return referenceSuperview.convert(point, to: layoutSuperview as? PinView.PinView)
}
}

internal func computeCoordinates(forAnchors anchors: [Anchor], _ context: Context) -> [CGPoint]? {
guard let layoutSuperview = layoutSuperview(context) else { return nil }
var results: [CGPoint] = []
anchors.forEach({ (anchor) in
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
if let referenceSuperview = referenceSuperview(anchor.view, context) {
results.append(computeCoordinates(anchor.point(keepTransform: keepTransform),
layoutSuperview, referenceSuperview))
Expand All@@ -392,7 +392,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: HorizontalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand All@@ -401,7 +401,7 @@ extension PinLayout {
}

internal func computeCoordinate(forEdge edge: VerticalEdge, _ context: Context) -> CGFloat? {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
guard let layoutSuperview = layoutSuperview(context) else { return nil }
guard let referenceSuperview = referenceSuperview(edge.view, context) else { return nil }

Expand Down
2 changes: 1 addition & 1 deletion Sources/Impl/PinLayout+Layouting.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,7 +45,7 @@ extension PinLayout {
isLayouted = true
}

private func apply(onView view: View) {
private func apply(onView view: PinView) {
displayLayoutWarnings()

var newRect = view.getRect(keepTransform: keepTransform)
Expand Down
14 changes: 7 additions & 7 deletions Sources/Impl/PinLayout+Warning.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,17 +36,17 @@ extension PinLayout {
}

internal func relativeEdgeContext(method: String, edge: VerticalEdge) -> String {
let edge = edge as! VerticalEdgeImpl<View>
let edge = edge as! VerticalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view)))"
}

internal func relativeEdgeContext(method: String, edge: HorizontalEdge) -> String {
let edge = edge as! HorizontalEdgeImpl<View>
let edge = edge as! HorizontalEdgeImpl<PinView>
return "\(method)(to: .\(edge.type.rawValue), of: \(viewDescription(edge.view))"
}

internal func relativeAnchorContext(method: String, anchor: Anchor) -> String {
let anchor = anchor as! AnchorImpl<View>
let anchor = anchor as! AnchorImpl<PinView>
return "\(method)(to: .\(anchor.type.rawValue), of: \(viewDescription(anchor.view)))"
}

Expand DownExpand Up@@ -114,20 +114,20 @@ extension PinLayout {
}
}

internal func viewDescription(_ view: View) -> String {
internal func viewDescription(_ view: PinView) -> String {
let rect = view.getRect(keepTransform: keepTransform)
return "(\(viewName(view)), Frame: \(rect))"
}

internal func viewName(_ view: View) -> String {
internal func viewName(_ view: PinView) -> String {
return "\(type(of: view))"
}

internal func insetsDescription(_ insets: PEdgeInsets) -> String {
return "UIEdgeInsets(top: \(insets.top), left: \(insets.left), bottom: \(insets.bottom), right: \(insets.right))"
}

internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: View) {
internal func pinLayoutDisplayConsoleWarning(_ text: String, _ view: PinView) {
var displayText = "\n👉 \(text)"

let rect = view.getRect(keepTransform: keepTransform)
Expand All@@ -142,7 +142,7 @@ extension PinLayout {
var hierarchy: [String] = []
while let parent = currentView.superview {
hierarchy.insert("\(type(of: parent))", at: 0)
currentView = parent as! View
currentView = parent as! PinView
}
if hierarchy.count > 0 {
#if swift(>=4.1)
Expand Down
30 changes: 15 additions & 15 deletions Sources/Impl/TypesImpl.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,10 +32,10 @@ struct Size {
var height: CGFloat?
}

class EdgeListImpl<View: Layoutable>: EdgeList {
internal let view: View
class EdgeListImpl<PinView: Layoutable>: EdgeList {
internal let view: PinView

init(view: View) {
init(view: PinView) {
self.view = view
}

Expand All@@ -52,14 +52,14 @@ class EdgeListImpl<View: Layoutable>: EdgeList {
var end: HorizontalEdge { return view.isLTR() ? right : left }
}

class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
class HorizontalEdgeImpl<PinView: Layoutable>: HorizontalEdge {
enum EdgeType: String {
case left
case hCenter
case right
}

let view: View
let view: PinView
let type: EdgeType

func x(keepTransform: Bool) -> CGFloat {
Expand All@@ -72,20 +72,20 @@ class HorizontalEdgeImpl<View: Layoutable>: HorizontalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
class VerticalEdgeImpl<PinView: Layoutable>: VerticalEdge {
enum EdgeType: String {
case top
case vCenter
case bottom
}

internal let view: View
internal let view: PinView
internal let type: EdgeType

func y(keepTransform: Bool) -> CGFloat {
Expand All@@ -99,16 +99,16 @@ class VerticalEdgeImpl<View: Layoutable>: VerticalEdge {
}
}

internal init(view: View, type: EdgeType) {
internal init(view: PinView, type: EdgeType) {
self.view = view
self.type = type
}
}

class AnchorListImpl<View: Layoutable>: AnchorList {
internal let view: View
class AnchorListImpl<PinView: Layoutable>: AnchorList {
internal let view: PinView

internal init(view: View) {
internal init(view: PinView) {
self.view = view
}

Expand DownExpand Up@@ -143,8 +143,8 @@ enum AnchorType: String {
case bottomRight
}

class AnchorImpl<View: Layoutable>: Anchor {
let view: View
class AnchorImpl<PinView: Layoutable>: Anchor {
let view: PinView
let type: AnchorType

func point(keepTransform: Bool) -> CGPoint {
Expand All@@ -161,7 +161,7 @@ class AnchorImpl<View: Layoutable>: Anchor {
}
}

fileprivate init(view: View, type: AnchorType) {
fileprivate init(view: PinView, type: AnchorType) {
self.view = view
self.type = type
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/Layoutable+PinLayout.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ import Foundation

extension Layoutable {
public var anchor: AnchorList {
return AnchorListImpl(view: self as! View)
return AnchorListImpl(view: self as! PinView)
}

public var edge: EdgeList {
return EdgeListImpl(view: self as! View)
return EdgeListImpl(view: self as! PinView)
}
}
8 changes: 4 additions & 4 deletions Sources/Layoutable.swift
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,15 +24,15 @@ import AppKit
#endif

public protocol Layoutable: AnyObject, Equatable, CustomDebugStringConvertible {
associatedtype View: Layoutable
associatedtype PinView: Layoutable

var superview: View? { get }
var subviews: [View] { get }
var superview: PinView? { get }
var subviews: [PinView] { get }

func getRect(keepTransform: Bool) -> CGRect
func setRect(_ rect: CGRect, keepTransform: Bool)

func convert(_ point: CGPoint, to view: View?) -> CGPoint
func convert(_ point: CGPoint, to view: PinView?) -> CGPoint

func isLTR() -> Bool
}
Loading