Skip to content

Commit de608bb

Browse files
authored
Delay opening context menu submenus on hover (#121)
* Delay opening context menu submenus on hover * Delay the Seen submenu when its stats arrive on hover
1 parent 93eab36 commit de608bb

2 files changed

Lines changed: 26 additions & 2 deletions

File tree

‎packages/ChatUI/Sources/ChatUI/MessageReadMenuItem.swift‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,9 @@ public final class MessageReadMenuRowItem : AppMenuRowItem {
325325

326326

327327
self.item.submenu = menu
328-
if let view = self.view, view.mouseInside() || self.isSelected {
328+
if let view = self.view as? AppMenuRowView, view.mouseInside() {
329+
view.presentSubmenuAfterDelay()
330+
} else if self.isSelected {
329331
self.interaction?.presentSubmenu(self.item)
330332
}
331333

‎packages/TGUIKit/Sources/AppMenuRowItem.swift‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,19 @@ open class AppMenuRowView: AppMenuBasicItemView {
371371
public let contentView = View()
372372

373373
private let hoverDisposable = MetaDisposable()
374+
private let submenuDisposable = MetaDisposable()
375+
376+
public func presentSubmenuAfterDelay() {
377+
submenuDisposable.set(delaySignal(0.157).start(completed: { [weak self] in
378+
guard let self, let item = self.item as? AppMenuRowItem, self.containerView.controlState == .Hover else {
379+
return
380+
}
381+
guard NSWindow.windowNumber(at: NSEvent.mouseLocation, belowWindowWithWindowNumber: 0) == self.window?.windowNumber else {
382+
return
383+
}
384+
item.interaction?.presentSubmenu(item.item)
385+
}))
386+
}
374387

375388
public required init(frame frameRect: NSRect) {
376389
super.init(frame: frameRect)
@@ -393,7 +406,11 @@ open class AppMenuRowView: AppMenuBasicItemView {
393406
guard let item = self?.item as? AppMenuRowItem, CheckWindow() else {
394407
return
395408
}
396-
item.interaction?.presentSubmenu(item.item)
409+
guard item.item.submenu != nil else {
410+
item.interaction?.presentSubmenu(item.item)
411+
return
412+
}
413+
self?.presentSubmenuAfterDelay()
397414
}, for: .Hover)
398415

399416

@@ -430,6 +447,10 @@ open class AppMenuRowView: AppMenuBasicItemView {
430447
self?.updateState(.Highlight)
431448
}
432449
self?.hoverDisposable.set(nil)
450+
self?.submenuDisposable.set(nil)
451+
if item.item.submenu != nil {
452+
item.interaction?.presentSubmenu(item.item)
453+
}
433454
}, for: .Highlight)
434455
containerView.set(handler: { [weak self] _ in
435456
if !CheckWindow() {
@@ -438,6 +459,7 @@ open class AppMenuRowView: AppMenuBasicItemView {
438459
self?.drawable?.updateState(.Normal)
439460
self?.updateState(.Normal)
440461
self?.hoverDisposable.set(nil)
462+
self?.submenuDisposable.set(nil)
441463
}, for: .Normal)
442464
containerView.set(handler: { [weak self] _ in
443465
if !CheckWindow() {

0 commit comments

Comments
 (0)