Explorar o código

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 hai 1 semana
pai
achega
fa9fb47b25
Modificáronse 1 ficheiros con 32 adicións e 6 borrados
  1. 32 6
      meetings_app/ViewController.swift

+ 32 - 6
meetings_app/ViewController.swift

@@ -168,8 +168,12 @@ private extension ViewController {
168 168
     }
169 169
 
170 170
     @objc private func sidebarItemClicked(_ sender: NSClickGestureRecognizer) {
171
-        guard let view = sender.view,
172
-              let page = sidebarPageByView[ObjectIdentifier(view)],
171
+        guard let view = sender.view else { return }
172
+        activateSidebarItem(view)
173
+    }
174
+
175
+    private func activateSidebarItem(_ view: NSView) {
176
+        guard let page = sidebarPageByView[ObjectIdentifier(view)],
173 177
               page != selectedSidebarPage || page == .settings else { return }
174 178
 
175 179
         if page == .settings {
@@ -196,6 +200,18 @@ private extension ViewController {
196 200
         showPaywall()
197 201
     }
198 202
 
203
+    @objc private func sidebarButtonClicked(_ sender: NSButton) {
204
+        guard let page = SidebarPage(rawValue: sender.tag),
205
+              page != selectedSidebarPage || page == .settings else { return }
206
+
207
+        if page == .settings {
208
+            showSettingsPopover()
209
+            return
210
+        }
211
+
212
+        showSidebarPage(page)
213
+    }
214
+
199 215
     @objc private func joinMeetClicked(_ sender: Any?) {
200 216
         let rawInput = meetLinkField?.stringValue.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
201 217
 
@@ -1852,10 +1868,15 @@ private class RowHitTestView: NSView {
1852 1868
     override func hitTest(_ point: NSPoint) -> NSView? {
1853 1869
         return bounds.contains(point) ? self : nil
1854 1870
     }
1871
+
1872
+    override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
1873
+        true
1874
+    }
1855 1875
 }
1856 1876
 
1857 1877
 private final class HoverTrackingView: RowHitTestView {
1858 1878
     var onHoverChanged: ((Bool) -> Void)?
1879
+    var onClick: (() -> Void)?
1859 1880
     var showsHandCursor = true
1860 1881
 
1861 1882
     private var trackingAreaRef: NSTrackingArea?
@@ -1896,6 +1917,12 @@ private final class HoverTrackingView: RowHitTestView {
1896 1917
         guard showsHandCursor else { return }
1897 1918
         addCursorRect(bounds, cursor: .pointingHand)
1898 1919
     }
1920
+
1921
+    override func mouseUp(with event: NSEvent) {
1922
+        super.mouseUp(with: event)
1923
+        guard event.type == .leftMouseUp else { return }
1924
+        onClick?()
1925
+    }
1899 1926
 }
1900 1927
 
1901 1928
 /// Hover tracking without overriding hit-testing; keeps controls like text fields interactive.
@@ -2201,7 +2228,9 @@ private extension ViewController {
2201 2228
     }
2202 2229
 
2203 2230
     func sidebarItem(_ text: String, icon: String, page: SidebarPage, logoImageName: String? = nil, logoIconWidth: CGFloat = 18, logoHeightMultiplier: CGFloat = 1, logoTemplate: Bool = true, showsDisclosure: Bool = false) -> NSView {
2204
-        let item = HoverTrackingView()
2231
+        let item = HoverButton(title: "", target: self, action: #selector(sidebarButtonClicked(_:)))
2232
+        item.tag = page.rawValue
2233
+        item.isBordered = false
2205 2234
         item.wantsLayer = true
2206 2235
         item.layer?.cornerRadius = 10
2207 2236
         item.layer?.backgroundColor = NSColor.clear.cgColor
@@ -2265,9 +2294,6 @@ private extension ViewController {
2265 2294
             self.applySidebarRowStyle(item, page: page, logoTemplate: logoTemplate, hovering: hovering)
2266 2295
         }
2267 2296
 
2268
-        let click = NSClickGestureRecognizer(target: self, action: #selector(sidebarItemClicked(_:)))
2269
-        item.addGestureRecognizer(click)
2270
-
2271 2297
         return item
2272 2298
     }
2273 2299