Просмотр исходного кода

Adjust fullscreen brand placement to replace traffic-light space.

Made-with: Cursor
huzaifahayat12 3 месяцев назад
Родитель
Сommit
e2b21daabf
1 измененных файлов с 53 добавлено и 1 удалено
  1. 53 1
      zoom_app/ViewController.swift

+ 53 - 1
zoom_app/ViewController.swift

@@ -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() {