|
|
@@ -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
|
|