Skip to content

Commit b77e981

Browse files
committed
Nicer marker drawing
1 parent 99cb3a8 commit b77e981

File tree

5 files changed

+48
-75
lines changed

5 files changed

+48
-75
lines changed

OpenTimelineIO-Sample/OpenTimelineIO-Reader/Views/ContentView.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ struct ContentView: View
3333
self.fileURL = fileURL
3434

3535
guard let fileURL = fileURL else { return }
36-
37-
38-
36+
3937
self.document.setupPlayerWithBaseDocumentURL(fileURL)
4038
}
4139

OpenTimelineIO-Sample/OpenTimelineIO-Reader/Views/ItemView.swift

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -13,50 +13,42 @@ import SwiftUI
1313
struct ItemView : View {
1414

1515
let item:OpenTimelineIO.Item
16-
@State var backgroundColor:Color
17-
@State var selected:Bool
16+
let backgroundColor:Color
17+
let selected:Bool
18+
19+
private var isGap: Bool {
20+
item.isKind(of: Gap.self)
21+
}
1822

1923
@Binding var secondsToPixels:Double
2024

2125
var body: some View
2226
{
23-
ZStack {
24-
25-
if let _ = item as? Gap
26-
{
27-
RoundedRectangle(cornerRadius: 3)
28-
.fill(Color("GapTrackBaseColor")) // Fill the RoundedRectangle with color
29-
.overlay(
30-
RoundedRectangle(cornerRadius: 3)
31-
.stroke(self.selected ? .white : .clear, lineWidth: 1) // Add stroke/outline
32-
)
33-
.frame(width: self.getSafeWidth() - 2)
34-
}
35-
else
36-
{
27+
ZStack
28+
{
29+
let fill:AnyShapeStyle = ( isGap ) ? AnyShapeStyle( Color("GapTrackBaseColor") ) : AnyShapeStyle(self.backgroundColor.gradient)
30+
let textGapOpacity:Double = ( isGap ) ? 0.0 : 1.0
31+
32+
RoundedRectangle(cornerRadius: 3)
33+
.fill(fill, style: FillStyle())
34+
.overlay(
3735
RoundedRectangle(cornerRadius: 3)
38-
.fill(self.backgroundColor.gradient) // Fill the RoundedRectangle with color
39-
.overlay(
40-
RoundedRectangle(cornerRadius: 3)
41-
.stroke(self.selected ? .white : .clear, lineWidth: 1) // Add stroke/outline
42-
)
36+
.strokeBorder(self.selected ? .orange : .clear, lineWidth: 1) // Add stroke/outline
4337
.frame(width: self.getSafeWidth() - 2)
44-
45-
if self.getSafeWidth() > 40
46-
{
47-
Text(item.name)
48-
.lineLimit(1)
49-
.font(.system(size: 10))
50-
.frame(width: self.getSafeWidth())
51-
}
52-
}
53-
}
54-
.frame(width: self.getSafeWidth(), alignment: .leading )
55-
.overlay {
56-
self.getMarkerView()
57-
58-
}
59-
// .offset(x:self.getSafePositionX() )//, y:geometry.size.height * 0.5 )
38+
)
39+
.frame(width: self.getSafeWidth() - 2)
40+
41+
Text(item.name)
42+
.lineLimit(1)
43+
.font(.system(size: 10))
44+
.frame(width: self.getSafeWidth())
45+
.opacity(self.getSafeWidth() > 40 ? textGapOpacity : 0.0)
46+
}
47+
.frame(width: self.getSafeWidth(), alignment: .leading )
48+
.overlay {
49+
// TODO: Get item marker coordinate system working
50+
// self.getMarkerView()
51+
}
6052
}
6153

6254
func getSafeRange() -> OpenTimelineIO.TimeRange

OpenTimelineIO-Sample/OpenTimelineIO-Reader/Views/TimeRulerView.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ struct TimeRulerView: View
2323
let startSeconds = safeRange.startTime.toSeconds()
2424
let endSeconds = safeRange.endTimeInclusive().toSeconds()
2525

26-
2726
// Draw ticks (including frame-level ticks)
2827
drawTicks(context: context, startSeconds: startSeconds, endSeconds: endSeconds, secondsToPixels: secondsToPixels, size: size)
2928

@@ -38,7 +37,7 @@ struct TimeRulerView: View
3837

3938
func drawMarkers(context: GraphicsContext, startSeconds: Double, endSeconds: Double, secondsToPixels: Double, size: CGSize)
4039
{
41-
let y = 15.0
40+
let y = 20.0
4241
if let tracks = self.timeline.tracks
4342
{
4443
let markerRange = tracks.markers.startIndex ..< tracks.markers.endIndex
@@ -85,7 +84,7 @@ struct TimeRulerView: View
8584
)
8685
}
8786

88-
let tickHeight = 20.0
87+
let tickHeight = 24.0
8988

9089
// Draw tick line
9190
let tickRect = CGRect(x: x, y: size.height - tickHeight, width: 1, height: tickHeight)
@@ -177,7 +176,7 @@ struct TimeRulerView: View
177176
}
178177

179178
let playheadPositionX = currentTime.toSeconds() * secondsToPixels
180-
let playheadRect = CGRect(x: playheadPositionX, y: 20, width: 1, height: size.height-20)
179+
let playheadRect = CGRect(x: playheadPositionX, y: 22, width: 1, height: size.height - 22)
181180
// context.fill(Path(playheadRect), with: .color(.orange))
182181

183182
if #available(macOS 14.0, *)

OpenTimelineIO-Sample/OpenTimelineIO-Reader/Views/TimelineView.swift

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,17 @@ struct TimelineView : View {
3232
{
3333
self.timelineView()
3434
.allowsHitTesting(self.hitTestEnabled)
35-
.drawingGroup(opaque: true)
35+
// .drawingGroup(opaque: true)
3636

3737
}
3838
.onScrollPhaseChange({ oldPhase, newPhase, context in
3939
guard oldPhase != newPhase else { return }
4040

4141
self.hitTestEnabled = !newPhase.isScrolling
4242
})
43+
.frame(idealHeight: ( CGFloat((timeline.videoTracks.count + timeline.audioTracks.count)) * TrackView.trackHeight) + 100 )
44+
// .frame(maxHeight: CGFloat((videoTracks.count + audioTracks.count)) * 500)
45+
4346
}
4447
else
4548
{
@@ -55,17 +58,12 @@ struct TimelineView : View {
5558
{
5659
let videoTracks = timeline.videoTracks
5760
let audioTracks = timeline.audioTracks
58-
5961

6062
VStack(alignment:.leading, spacing: 3)
6163
{
62-
TimeRulerView(timeline: self.timeline, secondsToPixels: self.$secondsToPixels, currentTime: self.$currentTime )
63-
.frame(height: 40)
64+
TimeRulerView(timeline: self.timeline, secondsToPixels: self.$secondsToPixels, currentTime: self.$currentTime )
65+
.frame(height: 50)
6466
.offset(x:100)
65-
// .overlay(
66-
// self.getMarkerView( )
67-
// )
68-
//
6967

7068
ForEach(0..<videoTracks.count, id: \.self) { index in
7169

@@ -78,8 +76,10 @@ struct TimelineView : View {
7876
selectedItem: self.$selectedItem )
7977
}
8078

79+
Spacer()
8180
Divider()
82-
81+
Spacer()
82+
8383
ForEach(0..<audioTracks.count, id: \.self) { index in
8484

8585
let track = audioTracks[index]
@@ -90,23 +90,6 @@ struct TimelineView : View {
9090
selectedItem: self.$selectedItem )
9191
}
9292
}
93-
.frame(height: CGFloat((videoTracks.count + audioTracks.count)) * 25 + 50 )
94-
.frame(maxHeight: CGFloat((videoTracks.count + audioTracks.count)) * 500)
9593

9694
}
97-
98-
// @ViewBuilder func getMarkerView() -> some View
99-
// {
100-
// HStack(alignment: .top, spacing: 0)
101-
// {
102-
// let markerRange = (self.timeline.tracks?.markers.startIndex ?? 0) ..< (self.timeline.tracks?.markers.endIndex ?? 0)
103-
// ForEach(markerRange, id:\.self) { markerIndex in
104-
// MarkerView(marker: self.timeline.tracks!.markers[markerIndex],
105-
// secondsToPixels: self.$secondsToPixels)
106-
// }
107-
// }
108-
//// .frame(width: self.getSafeWidth(), alignment: .leading )
109-
// .frame(alignment: .leading)
110-
// .border(Color.purple, width: 2)
111-
// }
11295
}

OpenTimelineIO-Sample/OpenTimelineIO-Reader/Views/TrackView.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ import SwiftUI
1414

1515
struct TrackView : View
1616
{
17+
static let trackHeight:CGFloat = 35
18+
1719
let track:OpenTimelineIO.Track
18-
@State var backgroundColor:Color
20+
let backgroundColor:Color
1921
@Binding var secondsToPixels:Double
2022
@Binding var selectedItem:Item?
2123

@@ -27,14 +29,13 @@ struct TrackView : View
2729
{
2830
Section(header: self.headerView() )
2931
{
30-
3132
ForEach(0..<items.count, id: \.self) { index in
3233
let item = items[index]
3334

3435
ItemView(item: item,
3536
backgroundColor: self.backgroundColor,
3637
// backgroundColor: [Color.red, Color.blue, Color.green, Color.yellow, Color.purple].randomElement()!,
37-
selected: item.isEquivalent(to: self.selectedItem ?? Item() ),
38+
selected: item == self.selectedItem,
3839
secondsToPixels: self.$secondsToPixels)
3940

4041
.onTapGesture {
@@ -44,7 +45,7 @@ struct TrackView : View
4445
}
4546
}
4647
}
47-
.frame(width: self.getSafeWidth(), alignment: .leading )
48+
.frame(width: self.getSafeWidth(), height:Self.trackHeight, alignment: .leading )
4849
.overlay {
4950
self.getMarkerView()
5051
}
@@ -64,7 +65,7 @@ struct TrackView : View
6465
.font(.system(size: 10))
6566
.bold()
6667
}
67-
.frame(width: 100)
68+
.frame(width: 100, height:Self.trackHeight)
6869
.onTapGesture {
6970
self.selectedItem = track
7071
print("selected Item")

0 commit comments

Comments
 (0)