mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-10-17 15:21:50 +00:00
macos: comment my split view
This commit is contained in:
@@ -1,15 +1,26 @@
|
||||
import SwiftUI
|
||||
|
||||
/// A split view shows a left and right (or top and bottom) view with a divider in the middle to do resizing.
|
||||
/// The terminlogy "left" and "right" is always used but for vertical splits "left" is "top" and "right" is "bottom".
|
||||
///
|
||||
/// This view is purpose built for our use case and I imagine we'll continue to make it more configurable
|
||||
/// as time goes on. For example, the splitter divider size and styling is all hardcoded.
|
||||
struct SplitView<L: View, R: View>: View {
|
||||
/// Direction of the split
|
||||
let direction: Direction
|
||||
|
||||
/// The left and right views to render.
|
||||
let left: L
|
||||
let right: R
|
||||
|
||||
/// The current fractional width of the split view. 0.5 means L/R are equally sized, for example.
|
||||
@State var split: CGFloat = 0.5
|
||||
|
||||
/// The visible size of the splitter, in points. The invisible size is a transparent hitbox that can still
|
||||
/// be used for getting a resize handle. The total width/height of the splitter is the sum of both.
|
||||
private let splitterVisibleSize: CGFloat = 1
|
||||
private let splitterInvisibleSize: CGFloat = 6
|
||||
|
||||
@State var split: CGFloat = 0.5
|
||||
|
||||
var body: some View {
|
||||
GeometryReader { geo in
|
||||
let leftRect = self.leftRect(for: geo.size)
|
||||
@@ -23,14 +34,20 @@ struct SplitView<L: View, R: View>: View {
|
||||
right
|
||||
.frame(width: rightRect.size.width, height: rightRect.size.height)
|
||||
.offset(x: rightRect.origin.x, y: rightRect.origin.y)
|
||||
Splitter(direction: direction, visibleSize: splitterVisibleSize, invisibleSize: splitterInvisibleSize)
|
||||
Divider(direction: direction, visibleSize: splitterVisibleSize, invisibleSize: splitterInvisibleSize)
|
||||
.position(splitterPoint)
|
||||
.gesture(dragGesture(geo.size, splitterPoint: splitterPoint))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func dragGesture(_ size: CGSize, splitterPoint: CGPoint) -> some Gesture {
|
||||
init(_ direction: Direction, @ViewBuilder left: (() -> L), @ViewBuilder right: (() -> R)) {
|
||||
self.direction = direction
|
||||
self.left = left()
|
||||
self.right = right()
|
||||
}
|
||||
|
||||
private func dragGesture(_ size: CGSize, splitterPoint: CGPoint) -> some Gesture {
|
||||
return DragGesture()
|
||||
.onChanged { gesture in
|
||||
let minSize: CGFloat = 10
|
||||
@@ -47,7 +64,8 @@ struct SplitView<L: View, R: View>: View {
|
||||
}
|
||||
}
|
||||
|
||||
func leftRect(for size: CGSize) -> CGRect {
|
||||
/// Calculates the bounding rect for the left view.
|
||||
private func leftRect(for size: CGSize) -> CGRect {
|
||||
// Initially the rect is the full size
|
||||
var result = CGRect(x: 0, y: 0, width: size.width, height: size.height)
|
||||
switch (direction) {
|
||||
@@ -63,7 +81,8 @@ struct SplitView<L: View, R: View>: View {
|
||||
return result
|
||||
}
|
||||
|
||||
func rightRect(for size: CGSize, leftRect: CGRect) -> CGRect {
|
||||
/// Calculates the bounding rect for the right view.
|
||||
private func rightRect(for size: CGSize, leftRect: CGRect) -> CGRect {
|
||||
// Initially the rect is the full size
|
||||
var result = CGRect(x: 0, y: 0, width: size.width, height: size.height)
|
||||
switch (direction) {
|
||||
@@ -83,7 +102,8 @@ struct SplitView<L: View, R: View>: View {
|
||||
return result
|
||||
}
|
||||
|
||||
func splitterPoint(for size: CGSize, leftRect: CGRect) -> CGPoint {
|
||||
/// Calculates the point at which the splitter should be rendered.
|
||||
private func splitterPoint(for size: CGSize, leftRect: CGRect) -> CGPoint {
|
||||
switch (direction) {
|
||||
case .horizontal:
|
||||
return CGPoint(x: leftRect.size.width, y: size.height / 2)
|
||||
@@ -92,12 +112,6 @@ struct SplitView<L: View, R: View>: View {
|
||||
return CGPoint(x: size.width / 2, y: leftRect.size.height)
|
||||
}
|
||||
}
|
||||
|
||||
init(_ direction: Direction, @ViewBuilder left: (() -> L), @ViewBuilder right: (() -> R)) {
|
||||
self.direction = direction
|
||||
self.left = left()
|
||||
self.right = right()
|
||||
}
|
||||
}
|
||||
|
||||
extension SplitView {
|
||||
|
Reference in New Issue
Block a user