| | |
| | | |
| | | @MainActor |
| | | final class QuickSwitchRootView: NSView { |
| | | private let backdropBlurView = NSVisualEffectView() |
| | | private let layerHostView = NSView() |
| | | private let backgroundLayer = CAGradientLayer() |
| | | private let safeAreaFillLayer = CALayer() |
| | | private let glassLayer = CALayer() |
| | |
| | | |
| | | override init(frame frameRect: NSRect) { |
| | | super.init(frame: frameRect) |
| | | setupBackdropBlurView() |
| | | setupLayerHostView() |
| | | wantsLayer = true |
| | | setupLayers() |
| | | } |
| | | |
| | | required init?(coder: NSCoder) { |
| | | super.init(coder: coder) |
| | | setupBackdropBlurView() |
| | | setupLayerHostView() |
| | | wantsLayer = true |
| | | setupLayers() |
| | | } |
| | |
| | | |
| | | override func layout() { |
| | | super.layout() |
| | | backdropBlurView.frame = bounds |
| | | layerHostView.frame = bounds |
| | | layoutLayers() |
| | | } |
| | | |
| | |
| | | value ?? NSNull() |
| | | } |
| | | |
| | | private func setupBackdropBlurView() { |
| | | backdropBlurView.material = .fullScreenUI |
| | | backdropBlurView.blendingMode = .behindWindow |
| | | backdropBlurView.state = .active |
| | | backdropBlurView.isEmphasized = false |
| | | backdropBlurView.frame = bounds |
| | | backdropBlurView.autoresizingMask = [.width, .height] |
| | | addSubview(backdropBlurView, positioned: .below, relativeTo: nil) |
| | | } |
| | | |
| | | private func setupLayerHostView() { |
| | | layerHostView.wantsLayer = true |
| | | layerHostView.frame = bounds |
| | | layerHostView.autoresizingMask = [.width, .height] |
| | | layerHostView.layer?.masksToBounds = true |
| | | layerHostView.layer?.backgroundColor = NSColor.clear.cgColor |
| | | addSubview(layerHostView, positioned: .above, relativeTo: backdropBlurView) |
| | | } |
| | | |
| | | private func setupLayers() { |
| | | guard let rootLayer = layer else { return } |
| | | guard let rootLayer = layerHostView.layer else { return } |
| | | |
| | | rootLayer.masksToBounds = true |
| | | backgroundLayer.colors = [ |
| | | NSColor.windowBackgroundColor.withAlphaComponent(0.72).cgColor, |
| | | NSColor.controlBackgroundColor.withAlphaComponent(0.62).cgColor |
| | | NSColor.windowBackgroundColor.withAlphaComponent(0.58).cgColor, |
| | | NSColor.controlBackgroundColor.withAlphaComponent(0.48).cgColor |
| | | ] |
| | | backgroundLayer.startPoint = CGPoint(x: 0.5, y: 1.0) |
| | | backgroundLayer.endPoint = CGPoint(x: 0.5, y: 0.0) |
| | |
| | | glassLayer.shadowOpacity = 0 |
| | | rootLayer.addSublayer(glassLayer) |
| | | |
| | | laneLayer.backgroundColor = NSColor.controlBackgroundColor.withAlphaComponent(0.50).cgColor |
| | | laneLayer.backgroundColor = NSColor.controlBackgroundColor.withAlphaComponent(0.68).cgColor |
| | | laneLayer.cornerRadius = 16 |
| | | laneLayer.masksToBounds = true |
| | | glassLayer.addSublayer(laneLayer) |
| | | laneLayer.addSublayer(spaceLaneContentLayer) |
| | | |
| | | shelfLayer.backgroundColor = NSColor.controlBackgroundColor.withAlphaComponent(0.42).cgColor |
| | | shelfLayer.backgroundColor = NSColor.controlBackgroundColor.withAlphaComponent(0.60).cgColor |
| | | shelfLayer.cornerRadius = 16 |
| | | shelfLayer.masksToBounds = true |
| | | glassLayer.addSublayer(shelfLayer) |
| | |
| | | container.name = column.app.name |
| | | container.cornerRadius = 14 |
| | | container.masksToBounds = true |
| | | container.backgroundColor = NSColor.controlBackgroundColor.withAlphaComponent(0.34).cgColor |
| | | container.borderColor = NSColor.separatorColor.withAlphaComponent(0.28).cgColor |
| | | container.backgroundColor = NSColor.controlBackgroundColor.withAlphaComponent(0.56).cgColor |
| | | container.borderColor = NSColor.separatorColor.withAlphaComponent(0.34).cgColor |
| | | container.borderWidth = 1 |
| | | |
| | | let header = CALayer() |
| | | header.backgroundColor = NSColor.controlBackgroundColor.withAlphaComponent(0.58).cgColor |
| | | header.backgroundColor = NSColor.controlBackgroundColor.withAlphaComponent(0.68).cgColor |
| | | |
| | | let appName = makeTextLayer( |
| | | string: column.app.name, |