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