forked from CodeEditApp/CodeEdit
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathEditorTabCloseButton.swift
More file actions
106 lines (97 loc) · 3.3 KB
/
EditorTabCloseButton.swift
File metadata and controls
106 lines (97 loc) · 3.3 KB
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
//
// EditorTabCloseButton.swift
// CodeEdit
//
// Created by Austin Condiff on 1/17/23.
//
import SwiftUI
struct EditorTabCloseButton: View {
var isActive: Bool
var isHoveringTab: Bool
var isDragging: Bool
var closeAction: () -> Void
@Binding var closeButtonGestureActive: Bool
var isDocumentEdited: Bool = false
@Environment(\.colorScheme)
var colorScheme
@State private var isPressingClose: Bool = false
@Binding var isHoveringClose: Bool
let buttonSize: CGFloat = 16
var body: some View {
HStack(alignment: .center) {
Image(systemName: isDocumentEdited && !isHoveringTab ? "circlebadge.fill" : "xmark")
.font(
.system(
size: isDocumentEdited && !isHoveringTab ? 9.5 : 11.5,
weight: .regular,
design: .rounded
)
)
.foregroundColor(
isActive
? colorScheme == .dark ? .primary : Color(.controlAccentColor)
: .secondary
)
}
.frame(width: buttonSize, height: buttonSize)
.background(backgroundColor)
.foregroundColor(isPressingClose ? .primary : .secondary)
.clipShape(RoundedRectangle(cornerRadius: 2))
.contentShape(Rectangle())
.gesture(
DragGesture(minimumDistance: 0)
.onChanged({ _ in
isPressingClose = true
closeButtonGestureActive = true
})
.onEnded({ value in
// If the final position of the mouse is within the bounds of the
// close button then close the tab
if value.location.x > 0
&& value.location.x < buttonSize
&& value.location.y > 0
&& value.location.y < buttonSize {
closeAction()
}
isPressingClose = false
closeButtonGestureActive = false
})
)
.onHover { hover in
isHoveringClose = hover
}
.accessibilityAddTraits(.isButton)
.accessibilityLabel(Text("Close"))
// Only show when the mouse is hovering and there is no tab dragging.
.opacity((isHoveringTab || isDocumentEdited == true) && !isDragging ? 1 : 0)
.animation(.easeInOut(duration: 0.08), value: isHoveringTab)
.padding(.leading, 4)
}
@ViewBuilder var backgroundColor: some View {
if colorScheme == .dark {
let opacity: Double = if isPressingClose {
0.10
} else if isHoveringClose {
0.05
} else {
0
}
Color(nsColor: .white)
.opacity(opacity)
} else {
let opacity: Double = if isPressingClose {
0.25
} else if isHoveringClose {
if isActive {
0.10
} else {
0.06
}
} else {
0.0
}
Color(nsColor: isActive ? .controlAccentColor : .systemGray)
.opacity(opacity)
}
}
}