Fix stale app hover bubbles
| | |
| | | - Fixed the Smart Start apply confirmation in Settings so the warning stays above the Settings window with clearer readable controls |
| | | - Fixed right-side tag navigation getting stuck in a dimmed drag visual state after a tag click |
| | | - Fixed an icon grid rendering issue that could make many app icons disappear after drag-state resets |
| | | - Fixed stale hover bubbles so app notes no longer remain pinned to the previous app while hovering another app |
| | | - Version updated to 7.3.5, Build updated to 744 |
| | | ``` |
| | | |
| | |
| | | - 确认设置按钮和编辑按钮都能从浮层右上角打开。 |
| | | - 确认设置页语言切换正常。 |
| | | - 确认标签拖拽排序、右侧标签点击切换、App 拖入标签、拖到未分类确认面板正常。 |
| | | - 确认快速滑过 App 图标时,用途气泡不会停留在上一个 App 上。 |
| | | - 确认数据页导出 / 导入分类与布局正常。 |
| | | - 确认 Smart Start 初始分类方案可应用、确认提示不被设置窗口遮挡、恢复和导出。 |
| | | - 确认 App Store 沙盒构建中 Launch at Login 控件隐藏。 |
| | |
| | | var sourceTag: String? = nil |
| | | var dragModeActive: Bool = false |
| | | var onDragModeChange: ((Bool) -> Void)? = nil |
| | | var onBubbleHover: ((AppInfo, CGRect, Bool) -> Void)? = nil |
| | | var onBubbleHover: ((AppInfo, CGRect, AppBubbleHoverEvent) -> Void)? = nil |
| | | var onEditNote: ((AppInfo, CGRect) -> Void)? = nil |
| | | var bubbleDisabled: Bool = false |
| | | var itemID: String |
| | |
| | | interactionFrame = frame |
| | | if bubbleDisabled || dragModeActive { |
| | | setHoverState(false) |
| | | onBubbleHover?(app, frame, false) |
| | | onBubbleHover?(app, frame, .exited) |
| | | return |
| | | } |
| | | if hovering { |
| | | setHoverState(true) |
| | | guard shouldShowAppBubble else { return } |
| | | onBubbleHover?(app, frame, hovering) |
| | | onBubbleHover?(app, frame, .entered(canShowBubble: shouldShowAppBubble)) |
| | | } else if isHovered { |
| | | setHoverState(false) |
| | | onBubbleHover?(app, frame, hovering) |
| | | onBubbleHover?(app, frame, .exited) |
| | | } else { |
| | | setHoverState(false) |
| | | } |
| | |
| | | .onChange(of: dragModeActive) { _, active in |
| | | if active { |
| | | setHoverState(false) |
| | | onBubbleHover?(app, interactionFrame, false) |
| | | onBubbleHover?(app, interactionFrame, .exited) |
| | | } |
| | | } |
| | | .onChange(of: bubbleDisabled) { _, disabled in |
| | | if disabled { |
| | | setHoverState(false) |
| | | onBubbleHover?(app, interactionFrame, false) |
| | | onBubbleHover?(app, interactionFrame, .exited) |
| | | } |
| | | } |
| | | .onDisappear { |
| | | if hoveredAppItemID == itemID { |
| | | hoveredAppItemID = nil |
| | | onBubbleHover?(app, interactionFrame, false) |
| | | onBubbleHover?(app, interactionFrame, .exited) |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | enum AppBubbleHoverEvent { |
| | | case entered(canShowBubble: Bool) |
| | | case exited |
| | | } |
| | | |
| | | private struct AppGridItemHoverTracker: NSViewRepresentable { |
| | | let onHover: (Bool, CGRect) -> Void |
| | | |
| | |
| | | notchHeight = activeScreen?.safeAreaInsets.top ?? 0 |
| | | } |
| | | |
| | | private func handleBubbleHover(app: AppInfo, frame: CGRect, hovering: Bool) { |
| | | private func handleBubbleHover(app: AppInfo, frame: CGRect, event: AppBubbleHoverEvent) { |
| | | guard !appBubbleDisabled else { |
| | | clearAppBubbleState() |
| | | return |
| | | } |
| | | guard editingBubble == nil else { return } |
| | | if hovering { |
| | | switch event { |
| | | case .entered(let canShowBubble): |
| | | if canShowBubble { |
| | | hoveredBubble = AppBubbleContext(app: app, frame: frame) |
| | | } else if hoveredBubble?.app.path == app.path { |
| | | } else { |
| | | hoveredBubble = nil |
| | | } |
| | | case .exited: |
| | | guard hoveredBubble?.app.path == app.path else { return } |
| | | hoveredBubble = nil |
| | | } |
| | | } |
| | |
| | | var showNames: Bool = true |
| | | var dragModeActive: Bool = false |
| | | var onDragModeChange: ((Bool) -> Void)? = nil |
| | | var onBubbleHover: ((AppInfo, CGRect, Bool) -> Void)? = nil |
| | | var onBubbleHover: ((AppInfo, CGRect, AppBubbleHoverEvent) -> Void)? = nil |
| | | var onEditNote: ((AppInfo, CGRect) -> Void)? = nil |
| | | var bubbleDisabled: Bool = false |
| | | var dragResetToken: Int = 0 |
| | |
| | | - 修复设置页“应用系统智能化初始分类”确认提示可能跑到设置窗口背后、被遮挡的问题,并优化为更清晰的实底确认框 |
| | | - 修复右侧标签列表点击后可能停留在拖拽视觉状态,导致后续标签无法正常点击切换的问题 |
| | | - 修复拖拽状态重置后 App 图标网格可能大量不渲染的问题,确保平铺、容器、网格视图切换后图标完整显示 |
| | | - 修复快速滑过 App 图标时旧用途气泡可能冻结在上一 App 上的问题,让新 hover 目标主动接管气泡状态 |
| | | - 版本号更新为 `7.3.5`,Build 更新为 `744` |
| | | |
| | | ## [7.3.4] — 2026-05-18 |