Kaynağa Gözat

Fix sidebar navigation clicks

Make Photo/Video/Tutorials sidebar rows use a button target/action so clicks reliably switch the right-side page.

Made-with: Cursor
huzaifahayat12 3 ay önce
ebeveyn
işleme
fa9fb47b25
1 değiştirilmiş dosya ile 32 ekleme ve 6 silme
  1. 32 6
      meetings_app/ViewController.swift

+ 32 - 6
meetings_app/ViewController.swift

@@ -168,8 +168,12 @@ private extension ViewController {
     }
 
     @objc private func sidebarItemClicked(_ sender: NSClickGestureRecognizer) {
-        guard let view = sender.view,
-              let page = sidebarPageByView[ObjectIdentifier(view)],
+        guard let view = sender.view else { return }
+        activateSidebarItem(view)
+    }
+
+    private func activateSidebarItem(_ view: NSView) {
+        guard let page = sidebarPageByView[ObjectIdentifier(view)],
               page != selectedSidebarPage || page == .settings else { return }
 
         if page == .settings {
@@ -196,6 +200,18 @@ private extension ViewController {
         showPaywall()
     }
 
+    @objc private func sidebarButtonClicked(_ sender: NSButton) {
+        guard let page = SidebarPage(rawValue: sender.tag),
+              page != selectedSidebarPage || page == .settings else { return }
+
+        if page == .settings {
+            showSettingsPopover()
+            return
+        }
+
+        showSidebarPage(page)
+    }
+
     @objc private func joinMeetClicked(_ sender: Any?) {
         let rawInput = meetLinkField?.stringValue.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
 
@@ -1852,10 +1868,15 @@ private class RowHitTestView: NSView {
     override func hitTest(_ point: NSPoint) -> NSView? {
         return bounds.contains(point) ? self : nil
     }
+
+    override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
+        true
+    }
 }
 
 private final class HoverTrackingView: RowHitTestView {
     var onHoverChanged: ((Bool) -> Void)?
+    var onClick: (() -> Void)?
     var showsHandCursor = true
 
     private var trackingAreaRef: NSTrackingArea?
@@ -1896,6 +1917,12 @@ private final class HoverTrackingView: RowHitTestView {
         guard showsHandCursor else { return }
         addCursorRect(bounds, cursor: .pointingHand)
     }
+
+    override func mouseUp(with event: NSEvent) {
+        super.mouseUp(with: event)
+        guard event.type == .leftMouseUp else { return }
+        onClick?()
+    }
 }
 
 /// Hover tracking without overriding hit-testing; keeps controls like text fields interactive.
@@ -2201,7 +2228,9 @@ private extension ViewController {
     }
 
     func sidebarItem(_ text: String, icon: String, page: SidebarPage, logoImageName: String? = nil, logoIconWidth: CGFloat = 18, logoHeightMultiplier: CGFloat = 1, logoTemplate: Bool = true, showsDisclosure: Bool = false) -> NSView {
-        let item = HoverTrackingView()
+        let item = HoverButton(title: "", target: self, action: #selector(sidebarButtonClicked(_:)))
+        item.tag = page.rawValue
+        item.isBordered = false
         item.wantsLayer = true
         item.layer?.cornerRadius = 10
         item.layer?.backgroundColor = NSColor.clear.cgColor
@@ -2265,9 +2294,6 @@ private extension ViewController {
             self.applySidebarRowStyle(item, page: page, logoTemplate: logoTemplate, hovering: hovering)
         }
 
-        let click = NSClickGestureRecognizer(target: self, action: #selector(sidebarItemClicked(_:)))
-        item.addGestureRecognizer(click)
-
         return item
     }