aboutsummaryrefslogtreecommitdiff
path: root/Sources/phbar/Views/BlockView.swift
blob: 85d6e6ef82b7898362099b7208fdbcfc6ea45d33 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import SwiftUI

struct BlockView: View {
	@ObservedObject var block: Block

	@State private var hovering = false

	var body: some View {
		HStack(spacing: 0) {
			ForEach(block.cells) { cell in
				CellView(cell: cell)
			}
		}
		.onHover { hovering = $0 }
		.onAppear {
			NSEvent.addLocalMonitorForEvents(matching: [
				.leftMouseDown,
				.rightMouseDown,
				.otherMouseDown,
				.scrollWheel,
			]) { event in
				handle(event: event)
			}
		}
	}

	private func handle(event: NSEvent) -> NSEvent {
		guard hovering else { return event }

		switch event.type {
		case .leftMouseDown, .rightMouseDown, .otherMouseDown:
			block.runScript(env: ["BUTTON": String(event.buttonNumber)])
			break
		case .scrollWheel:
			if event.scrollingDeltaY > 0 {
				block.runScript(env: ["SCROLL": "UP"])
				break
			}

			if event.scrollingDeltaY < 0 {
				block.runScript(env: ["SCROLL": "DOWN"])
				break
			}

			if event.scrollingDeltaX > 0 {
				block.runScript(env: ["SCROLL": "RIGHT"])
				break
			}

			if event.scrollingDeltaX < 0 {
				block.runScript(env: ["SCROLL": "LEFT"])
				break
			}
		default:
			break
		}

		return event
	}
}