Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

Match floating palette waveform styling to popover

authored by

Esteban Uribe and committed by
prompt.ac/@jeffrey
1e111e44 6b2576a1

+53 -5
+53 -5
slab/menuband/Sources/MenuBand/FloatingPlayPalette.swift
··· 275 275 private final class FloatingPlayPaletteView: NSView { 276 276 private weak var menuBand: MenuBandController? 277 277 private let waveformView = WaveformView() 278 + private let waveformBezel = NSView() 278 279 private let pianoView: FloatingPianoView 279 280 private let dragHandle = FloatingPaletteDragHandleView() 280 281 private let closeButton = NSButton() ··· 298 299 299 300 waveformView.menuBand = menuBand 300 301 waveformView.translatesAutoresizingMaskIntoConstraints = false 302 + waveformBezel.wantsLayer = true 303 + waveformBezel.layer?.cornerRadius = 6 304 + waveformBezel.layer?.backgroundColor = NSColor(white: 0.06, alpha: 1.0).cgColor 305 + waveformBezel.layer?.borderWidth = 1 306 + waveformBezel.translatesAutoresizingMaskIntoConstraints = false 301 307 pianoView.translatesAutoresizingMaskIntoConstraints = false 302 308 dragHandle.translatesAutoresizingMaskIntoConstraints = false 303 309 closeButton.translatesAutoresizingMaskIntoConstraints = false 304 310 shortcutHintLabel.translatesAutoresizingMaskIntoConstraints = false 305 - addSubview(waveformView) 311 + waveformBezel.addSubview(waveformView) 312 + addSubview(waveformBezel) 306 313 addSubview(pianoView) 307 314 shortcutHintLabel.font = NSFont.systemFont(ofSize: 10) 308 315 shortcutHintLabel.textColor = .secondaryLabelColor ··· 329 336 equalToConstant: waveformHeight(for: keyboardSize) 330 337 ) 331 338 self.waveformHeightConstraint = waveformHeightConstraint 339 + let bezelInset: CGFloat = 5 332 340 333 341 NSLayoutConstraint.activate([ 334 342 widthAnchor.constraint(equalToConstant: keyboardSize.width + inset * 2), ··· 343 351 dragHandle.centerYAnchor.constraint(equalTo: closeButton.centerYAnchor), 344 352 dragHandle.heightAnchor.constraint(equalToConstant: closeSize), 345 353 346 - waveformView.topAnchor.constraint(equalTo: closeButton.bottomAnchor, constant: gap), 347 - waveformView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: inset), 348 - waveformView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -inset), 354 + waveformBezel.topAnchor.constraint(equalTo: closeButton.bottomAnchor, constant: gap), 355 + waveformBezel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: inset), 356 + waveformBezel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -inset), 357 + waveformView.leadingAnchor.constraint(equalTo: waveformBezel.leadingAnchor, constant: bezelInset), 358 + waveformView.trailingAnchor.constraint(equalTo: waveformBezel.trailingAnchor, constant: -bezelInset), 359 + waveformView.topAnchor.constraint(equalTo: waveformBezel.topAnchor, constant: bezelInset), 360 + waveformView.bottomAnchor.constraint(equalTo: waveformBezel.bottomAnchor, constant: -bezelInset), 349 361 waveformHeightConstraint, 350 362 351 - pianoView.topAnchor.constraint(equalTo: waveformView.bottomAnchor, constant: gap), 363 + pianoView.topAnchor.constraint(equalTo: waveformBezel.bottomAnchor, constant: gap), 352 364 pianoView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: inset), 353 365 pianoView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -inset), 354 366 ··· 367 379 368 380 override var acceptsFirstResponder: Bool { true } 369 381 382 + override func viewDidChangeEffectiveAppearance() { 383 + super.viewDidChangeEffectiveAppearance() 384 + applyAppearanceToVisualizer() 385 + } 386 + 370 387 override var fittingSize: NSSize { 371 388 pianoView.refreshLayout() 372 389 layoutSubtreeIfNeeded() ··· 390 407 waveformHeightConstraint?.constant = waveformHeight(for: keyboardSize) 391 408 pianoView.refreshLayout() 392 409 layoutSubtreeIfNeeded() 410 + applyAppearanceToVisualizer() 411 + applyWaveformTint() 393 412 updateWaveformLiveState(isPresented: window?.isVisible == true) 394 413 needsDisplay = true 395 414 pianoView.needsDisplay = true ··· 400 419 } 401 420 402 421 func setPresented(_ isPresented: Bool) { 422 + applyAppearanceToVisualizer() 423 + applyWaveformTint() 403 424 updateWaveformLiveState(isPresented: isPresented) 404 425 } 405 426 406 427 private func updateWaveformLiveState(isPresented: Bool) { 407 428 waveformView.isLive = isPresented && !(menuBand?.midiMode ?? false) 408 429 waveformView.alphaValue = (menuBand?.midiMode ?? false) ? 0.35 : 1.0 430 + } 431 + 432 + private func applyAppearanceToVisualizer() { 433 + let isDark = effectiveAppearance.bestMatch(from: [.aqua, .darkAqua]) == .darkAqua 434 + waveformView.setLightMode(!isDark) 435 + if isDark { 436 + waveformBezel.layer?.backgroundColor = NSColor(white: 0.06, alpha: 1.0).cgColor 437 + } else { 438 + waveformBezel.layer?.backgroundColor = NSColor(white: 0.82, alpha: 1.0).cgColor 439 + } 440 + } 441 + 442 + private func applyWaveformTint() { 443 + guard let menuBand else { return } 444 + if menuBand.midiMode { 445 + waveformView.setDotMatrix(MenuBandPopoverViewController.midiDotPattern) 446 + waveformView.setBaseColor(.controlAccentColor) 447 + waveformBezel.layer?.borderColor = NSColor.controlAccentColor 448 + .withAlphaComponent(0.55).cgColor 449 + } else { 450 + waveformView.setDotMatrix(nil) 451 + let safe = max(0, min(127, Int(menuBand.melodicProgram))) 452 + let familyColor = InstrumentListView.colorForProgram(safe) 453 + waveformView.setBaseColor(familyColor) 454 + waveformBezel.layer?.borderColor = familyColor 455 + .withAlphaComponent(0.55).cgColor 456 + } 409 457 } 410 458 411 459 private func keyboardSize() -> NSSize {