|
@@ -186,6 +186,7 @@ class ViewController: NSViewController {
|
|
|
private let nativeTrafficLightsLeading: CGFloat = 14
|
|
private let nativeTrafficLightsLeading: CGFloat = 14
|
|
|
private let nativeTrafficLightsTopInset: CGFloat = 20
|
|
private let nativeTrafficLightsTopInset: CGFloat = 20
|
|
|
private let brandLeadingInset: CGFloat = 84
|
|
private let brandLeadingInset: CGFloat = 84
|
|
|
|
|
+ private let brandFullScreenLeadingInset: CGFloat = 14
|
|
|
private let accentBlue = NSColor(calibratedRed: 27 / 255, green: 115 / 255, blue: 232 / 255, alpha: 1)
|
|
private let accentBlue = NSColor(calibratedRed: 27 / 255, green: 115 / 255, blue: 232 / 255, alpha: 1)
|
|
|
private let accentOrange = NSColor(calibratedRed: 254 / 255, green: 117 / 255, blue: 46 / 255, alpha: 1)
|
|
private let accentOrange = NSColor(calibratedRed: 254 / 255, green: 117 / 255, blue: 46 / 255, alpha: 1)
|
|
|
private var primaryText: NSColor { palette.primaryText }
|
|
private var primaryText: NSColor { palette.primaryText }
|
|
@@ -301,6 +302,8 @@ class ViewController: NSViewController {
|
|
|
private var topBarProfileInitial = "H"
|
|
private var topBarProfileInitial = "H"
|
|
|
private var clockTimer: Timer?
|
|
private var clockTimer: Timer?
|
|
|
private var meetingsRefreshTimer: Timer?
|
|
private var meetingsRefreshTimer: Timer?
|
|
|
|
|
+ private var brandLeadingConstraint: NSLayoutConstraint?
|
|
|
|
|
+ private var windowFullScreenObservers: [NSObjectProtocol] = []
|
|
|
private var isSigningIn = false
|
|
private var isSigningIn = false
|
|
|
private var isPromptingZoomCredentials = false
|
|
private var isPromptingZoomCredentials = false
|
|
|
private var isLoadingMeetings = false
|
|
private var isLoadingMeetings = false
|
|
@@ -489,9 +492,11 @@ class ViewController: NSViewController {
|
|
|
window.titlebarAppearsTransparent = true
|
|
window.titlebarAppearsTransparent = true
|
|
|
window.isMovableByWindowBackground = true
|
|
window.isMovableByWindowBackground = true
|
|
|
window.styleMask.insert(.fullSizeContentView)
|
|
window.styleMask.insert(.fullSizeContentView)
|
|
|
|
|
+ installWindowFullScreenObservers(for: window)
|
|
|
}
|
|
}
|
|
|
alignNativeTrafficLights()
|
|
alignNativeTrafficLights()
|
|
|
showHomeView(profile: nil)
|
|
showHomeView(profile: nil)
|
|
|
|
|
+ syncBrandPositionForCurrentWindowState(animated: false)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
override func viewDidLayout() {
|
|
override func viewDidLayout() {
|
|
@@ -513,6 +518,46 @@ class ViewController: NSViewController {
|
|
|
])
|
|
])
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private func installWindowFullScreenObservers(for window: NSWindow) {
|
|
|
|
|
+ guard windowFullScreenObservers.isEmpty else { return }
|
|
|
|
|
+
|
|
|
|
|
+ let center = NotificationCenter.default
|
|
|
|
|
+ let enterObserver = center.addObserver(
|
|
|
|
|
+ forName: NSWindow.didEnterFullScreenNotification,
|
|
|
|
|
+ object: window,
|
|
|
|
|
+ queue: .main
|
|
|
|
|
+ ) { [weak self] _ in
|
|
|
|
|
+ self?.syncBrandPositionForCurrentWindowState(animated: true)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ let exitObserver = center.addObserver(
|
|
|
|
|
+ forName: NSWindow.didExitFullScreenNotification,
|
|
|
|
|
+ object: window,
|
|
|
|
|
+ queue: .main
|
|
|
|
|
+ ) { [weak self] _ in
|
|
|
|
|
+ self?.syncBrandPositionForCurrentWindowState(animated: true)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ windowFullScreenObservers = [enterObserver, exitObserver]
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private func syncBrandPositionForCurrentWindowState(animated: Bool) {
|
|
|
|
|
+ guard let constraint = brandLeadingConstraint else { return }
|
|
|
|
|
+ let isFullScreen = view.window?.styleMask.contains(.fullScreen) == true
|
|
|
|
|
+ let targetInset = isFullScreen ? brandFullScreenLeadingInset : brandLeadingInset
|
|
|
|
|
+
|
|
|
|
|
+ guard abs(constraint.constant - targetInset) > 0.5 else { return }
|
|
|
|
|
+ if animated {
|
|
|
|
|
+ NSAnimationContext.runAnimationGroup { context in
|
|
|
|
|
+ context.duration = 0.2
|
|
|
|
|
+ constraint.animator().constant = targetInset
|
|
|
|
|
+ view.layoutSubtreeIfNeeded()
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ constraint.constant = targetInset
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private func showHomeView(profile: GoogleUserProfile?) {
|
|
private func showHomeView(profile: GoogleUserProfile?) {
|
|
|
clearMeetingsScrollObserver()
|
|
clearMeetingsScrollObserver()
|
|
|
clearMeetingsPageScrollObserver()
|
|
clearMeetingsPageScrollObserver()
|
|
@@ -4177,8 +4222,11 @@ class ViewController: NSViewController {
|
|
|
let searchRowCenterX = searchRow.centerXAnchor.constraint(equalTo: topBar.centerXAnchor)
|
|
let searchRowCenterX = searchRow.centerXAnchor.constraint(equalTo: topBar.centerXAnchor)
|
|
|
searchRowCenterX.priority = .defaultHigh
|
|
searchRowCenterX.priority = .defaultHigh
|
|
|
|
|
|
|
|
|
|
+ let brandLeading = brandStack.leadingAnchor.constraint(equalTo: shell.leadingAnchor, constant: brandLeadingInset)
|
|
|
|
|
+ brandLeadingConstraint = brandLeading
|
|
|
|
|
+
|
|
|
NSLayoutConstraint.activate([
|
|
NSLayoutConstraint.activate([
|
|
|
- brandStack.leadingAnchor.constraint(equalTo: shell.leadingAnchor, constant: brandLeadingInset),
|
|
|
|
|
|
|
+ brandLeading,
|
|
|
brandStack.trailingAnchor.constraint(lessThanOrEqualTo: searchRow.leadingAnchor, constant: -12),
|
|
brandStack.trailingAnchor.constraint(lessThanOrEqualTo: searchRow.leadingAnchor, constant: -12),
|
|
|
brandStack.centerYAnchor.constraint(equalTo: chromeHeader.centerYAnchor, constant: -1),
|
|
brandStack.centerYAnchor.constraint(equalTo: chromeHeader.centerYAnchor, constant: -1),
|
|
|
|
|
|
|
@@ -4731,6 +4779,10 @@ class ViewController: NSViewController {
|
|
|
removeMeetingSearchObserver()
|
|
removeMeetingSearchObserver()
|
|
|
clearMeetingsPageScrollObserver()
|
|
clearMeetingsPageScrollObserver()
|
|
|
removeSearchShortcutMonitor()
|
|
removeSearchShortcutMonitor()
|
|
|
|
|
+ for observer in windowFullScreenObservers {
|
|
|
|
|
+ NotificationCenter.default.removeObserver(observer)
|
|
|
|
|
+ }
|
|
|
|
|
+ windowFullScreenObservers.removeAll()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private func startClock() {
|
|
private func startClock() {
|