| | |
| | | if isHoverCommand(command) { |
| | | hoverResponseLatencyMilliseconds.append(elapsed) |
| | | } |
| | | if lastCommitSource == .mouse { |
| | | break |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | "spaceID": segment.space.id, |
| | | "label": segment.space.label |
| | | ]) |
| | | focusSpace(segment.space.id, persistent: true) |
| | | lastSpaceLaneClickSpaceID = segment.space.id |
| | | |
| | | guard let firstCard = firstWaterfallCard(inSpaceID: segment.space.id) else { |
| | | DevelopmentDiagnostics.log("quickSwitch.view.clickSpaceLane.emptySpaceUnsupported", [ |
| | | "spaceID": segment.space.id, |
| | | "label": segment.space.label |
| | | ]) |
| | | return |
| | | } |
| | | |
| | | commitWindowCard(firstCard, trigger: "spaceLane") |
| | | } |
| | | |
| | | private func focusSpace(_ spaceID: UInt64, persistent: Bool) { |
| | |
| | | columnSelectionHistory[nextSelection.appGroupIndex] = nextSelection.windowIndex |
| | | lastAppShelfClickChangedSelection = previousSelection != nextSelection |
| | | ensureWaterfallSelectionVisible(nextSelection, horizontalIntent: .alignWithAppShelf(animated: true)) |
| | | updateHoverState(appGroupIndex: appGroupIndex, windowID: nil, spaceID: nil) |
| | | commitWindowCard(firstCard, trigger: "appShelf") |
| | | } else { |
| | | lastAppShelfClickChangedSelection = false |
| | | ensureWaterfallColumnVisible(column) |
| | | updateHoverState(appGroupIndex: appGroupIndex, windowID: nil, spaceID: nil) |
| | | needsLayout = true |
| | | } |
| | | updateHoverState(appGroupIndex: appGroupIndex, windowID: nil, spaceID: nil) |
| | | needsLayout = true |
| | | } |
| | | |
| | | private func scrollAppShelf(to targetOffset: CGFloat) { |
| | |
| | | |
| | | private func clickWindowCard(_ card: WaterfallCardLayers) { |
| | | hoverWindowCard(card) |
| | | commitWindowCard(card, trigger: "windowCard") |
| | | } |
| | | |
| | | private func commitWindowCard(_ card: WaterfallCardLayers, trigger: String) { |
| | | let selection = QuickSwitchSelection( |
| | | appGroupIndex: card.item.appGroupIndex, |
| | | windowIndex: card.item.windowIndex, |
| | | windowID: card.item.window.id |
| | | ) |
| | | DevelopmentDiagnostics.log("quickSwitch.view.clickWindowCard", [ |
| | | DevelopmentDiagnostics.log("quickSwitch.view.commitMouseWindow", [ |
| | | "trigger": trigger, |
| | | "appGroupIndex": selection.appGroupIndex, |
| | | "windowIndex": selection.windowIndex, |
| | | "windowID": selection.windowID, |
| | |
| | | glassLayer.addSublayer(laneLayer) |
| | | laneLayer.addSublayer(spaceLaneContentLayer) |
| | | |
| | | shelfLayer.backgroundColor = NSColor.controlBackgroundColor.withAlphaComponent(0.60).cgColor |
| | | shelfLayer.backgroundColor = NSColor.clear.cgColor |
| | | shelfLayer.cornerRadius = 16 |
| | | shelfLayer.masksToBounds = true |
| | | glassLayer.addSublayer(shelfLayer) |
| | |
| | | .sorted() |
| | | } |
| | | |
| | | private func firstWaterfallCard(inSpaceID spaceID: UInt64) -> WaterfallCardLayers? { |
| | | for column in waterfallColumns.sorted(by: { $0.column.appGroupIndex < $1.column.appGroupIndex }) { |
| | | if let card = column.cards |
| | | .sorted(by: { $0.item.windowIndex < $1.item.windowIndex }) |
| | | .first(where: { $0.item.primarySpaceID == spaceID }) { |
| | | return card |
| | | } |
| | | } |
| | | |
| | | return nil |
| | | } |
| | | |
| | | private func spaceFocusWindowCount(for appGroupIndex: Int) -> Int { |
| | | guard let activeSpaceFocusID else { return 0 } |
| | | |