aboutsummaryrefslogtreecommitdiff
path: root/Hotline/Library/Views/HotlinePanel.swift
blob: 137bcbb7b8952f5199894a74de78f085bb5434ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import Cocoa
import SwiftUI

private let HOTLINE_PANEL_SIZE: CGSize = CGSizeMake(468, 114 - 10)

class HotlinePanel: NSPanel {
  init(_ view: HotlinePanelView) {
    super.init(
      contentRect: NSRect(
        x: 0, y: 0, width: HOTLINE_PANEL_SIZE.width, height: HOTLINE_PANEL_SIZE.height),
      styleMask: [.nonactivatingPanel, .titled, .closable, .utilityWindow, .fullSizeContentView],
      backing: .buffered, defer: false)

    // Make sure that the panel is in front of almost all other windows
    self.isFloatingPanel = true
    self.level = .floating
    self.hidesOnDeactivate = true
    self.animationBehavior = .utilityWindow
    
    // Allow the panelto appear in a fullscreen space
//    self.collectionBehavior.insert(.fullScreenAuxiliary)
    self.collectionBehavior.insert(.canJoinAllSpaces)
    self.collectionBehavior.insert(.ignoresCycle)

    //    self.appearance = NSAppearance(named: .vibrantDark)

    // Don't delete panel state when it's closed.
    self.isReleasedWhenClosed = false

    // Disable state restoration for this utility panel
    self.isRestorable = false

    self.standardWindowButton(.closeButton)?.isHidden = false
    self.standardWindowButton(.zoomButton)?.isHidden = true
    self.standardWindowButton(.miniaturizeButton)?.isHidden = true

    // Make it transparent, the view inside will have to set the background.
    // This is necessary because otherwise, we will have some space for the titlebar on top of the height of the view itself which we don't want.
    self.isOpaque = false
    self.backgroundColor = .clear

    // Since we don't show a statusbar, this allows us to drag the window by its background instead of the titlebar.
    self.isMovableByWindowBackground = true
    self.titlebarAppearsTransparent = true

    let hostingView = NSHostingView(rootView: view.edgesIgnoringSafeArea(.top))
    hostingView.sizingOptions = [.preferredContentSize]

    let visualEffectView = NSVisualEffectView(
      frame: NSRect(x: 0, y: 0, width: HOTLINE_PANEL_SIZE.width, height: HOTLINE_PANEL_SIZE.height))
    visualEffectView.material = .sidebar
    visualEffectView.blendingMode = .behindWindow
    visualEffectView.state = NSVisualEffectView.State.active
    visualEffectView.autoresizingMask = [.width, .height]
    visualEffectView.autoresizesSubviews = true
    visualEffectView.addSubview(hostingView)

    self.contentView = visualEffectView

    hostingView.frame = visualEffectView.bounds

    self.cascadeTopLeft(from: NSMakePoint(16, 16))
  }

  override var canBecomeKey: Bool {
    return false
  }

  override var canBecomeMain: Bool {
    return false
  }
}