forked from intitni/CopilotForXcode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathChatPanelWindow.swift
More file actions
101 lines (90 loc) · 3.05 KB
/
ChatPanelWindow.swift
File metadata and controls
101 lines (90 loc) · 3.05 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import AppKit
import ChatTab
import Combine
import ComposableArchitecture
import Foundation
import SwiftUI
final class ChatPanelWindow: NSWindow {
override var canBecomeKey: Bool { true }
override var canBecomeMain: Bool { true }
private var cancellable: Set<AnyCancellable> = []
var minimizeWindow: () -> Void = {}
init(
store: StoreOf<ChatPanelFeature>,
chatTabPool: ChatTabPool,
minimizeWindow: @escaping () -> Void
) {
self.minimizeWindow = minimizeWindow
super.init(
contentRect: .zero,
styleMask: [.resizable, .titled, .miniaturizable, .fullSizeContentView],
backing: .buffered,
defer: false
)
titleVisibility = .hidden
addTitlebarAccessoryViewController({
let controller = NSTitlebarAccessoryViewController()
let view = NSHostingView(rootView: ChatTitleBar(store: store))
controller.view = view
view.frame = .init(x: 0, y: 0, width: 100, height: 40)
controller.layoutAttribute = .right
return controller
}())
titlebarAppearsTransparent = true
isReleasedWhenClosed = false
isOpaque = false
backgroundColor = .clear
level = .init(NSWindow.Level.floating.rawValue + 1)
collectionBehavior = [
.fullScreenAuxiliary,
.transient,
.fullScreenPrimary,
.fullScreenAllowsTiling,
]
hasShadow = true
contentView = NSHostingView(
rootView: ChatWindowView(
store: store,
toggleVisibility: { [weak self] isDisplayed in
guard let self else { return }
self.isPanelDisplayed = isDisplayed
}
)
.environment(\.chatTabPool, chatTabPool)
)
setIsVisible(true)
isPanelDisplayed = false
let viewStore = ViewStore(store)
viewStore.publisher
.map(\.isDetached)
.receive(on: DispatchQueue.main)
.sink { [weak self] isDetached in
guard let self else { return }
if UserDefaults.shared.value(for: \.disableFloatOnTopWhenTheChatPanelIsDetached) {
self.level = isDetached
? .init(NSWindow.Level.floating.rawValue)
: .init(NSWindow.Level.mainMenu.rawValue + 1)
} else {
self.level = .init(NSWindow.Level.mainMenu.rawValue + 1)
}
}.store(in: &cancellable)
}
var isWindowHidden: Bool = false {
didSet {
alphaValue = isPanelDisplayed && !isWindowHidden ? 1 : 0
}
}
var isPanelDisplayed: Bool = false {
didSet {
alphaValue = isPanelDisplayed && !isWindowHidden ? 1 : 0
}
}
override var alphaValue: CGFloat {
didSet {
ignoresMouseEvents = alphaValue <= 0
}
}
override func miniaturize(_: Any?) {
minimizeWindow()
}
}