Skip to content

Commit

Permalink
imrproving positioning of events
Browse files Browse the repository at this point in the history
simplified some code
  • Loading branch information
haskins-io committed Apr 16, 2024
1 parent 6d312c4 commit d495f8d
Show file tree
Hide file tree
Showing 12 changed files with 80 additions and 86 deletions.
2 changes: 0 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ I'm developing this as part of an application that requires multiple calendar vi

All the calendars are written purely in SwiftUI.

What is on the master branch should work.

## Available Calendars
### CKTimelineDay

Expand Down
6 changes: 2 additions & 4 deletions Sources/SwiftUiCalendarKit/Calendars/CKCompactDay.swift
Original file line number Diff line number Diff line change
Expand Up @@ -58,17 +58,15 @@ public struct CKCompactDay<Detail: View>: View {
width: proxy.size.width - 65
)

ForEach(eventData, id: \.self) { event in
ForEach(eventData, id: \.anyHashableID) { event in
CKCompactEventView(
event,
detail: detail,
applyXOffset: false
detail: detail
)
}
}
}
}
.background(Color.white)
}
}
}
Expand Down
12 changes: 6 additions & 6 deletions Sources/SwiftUiCalendarKit/Calendars/CKCompactMonth.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,22 +39,22 @@ public struct CKCompactMonth<Detail: View>: View {
NavigationView {

let event1 = CKEvent(
startDate: Date().dateFrom(16, 4, 2024, 12, 00),
endDate: Date().dateFrom(16, 4, 2024, 13, 00),
startDate: Date().dateFrom(14, 4, 2024, 1, 00),
endDate: Date().dateFrom(14, 4, 2024, 2, 00),
text: "Event 1",
backCol: "#D74D64"
)

let event2 = CKEvent(
startDate: Date().dateFrom(16, 4, 2024, 12, 15),
endDate: Date().dateFrom(16, 4, 2024, 13, 15),
startDate: Date().dateFrom(15, 4, 2024, 2, 00),
endDate: Date().dateFrom(15, 4, 2024, 3, 00),
text: "Event 2",
backCol: "#3E56C2"
)

let event3 = CKEvent(
startDate: Date().dateFrom(16, 4, 2024, 12, 30),
endDate: Date().dateFrom(16, 4, 2024, 15, 01),
startDate: Date().dateFrom(16, 4, 2024, 3, 30),
endDate: Date().dateFrom(16, 4, 2024, 4, 30),
text: "Event 3",
backCol: "#F6D264"
)
Expand Down
5 changes: 2 additions & 3 deletions Sources/SwiftUiCalendarKit/Calendars/CKCompactWeek.swift
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,10 @@ public struct CKCompactWeek<Detail: View>: View {
width: proxy.size.width - 65
)

ForEach(eventData, id: \.self) { event in
ForEach(eventData, id: \.anyHashableID) { event in
CKCompactEventView(
event,
detail: detail,
applyXOffset: false
detail: detail
)
}
}
Expand Down
13 changes: 6 additions & 7 deletions Sources/SwiftUiCalendarKit/Calendars/CKMonth.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ public struct CKMonth: View {

monthGrid(proxy: proxy)
}
.background(Color.white)
.padding(0)
}
}
Expand Down Expand Up @@ -95,22 +94,22 @@ public struct CKMonth: View {


let event1 = CKEvent(
startDate: Date().dateFrom(13, 4, 2024, 12, 00),
endDate: Date().dateFrom(13, 4, 2024, 13, 00),
startDate: Date().dateFrom(14, 4, 2024, 1, 00),
endDate: Date().dateFrom(14, 4, 2024, 2, 00),
text: "Event 1",
backCol: "#D74D64"
)

let event2 = CKEvent(
startDate: Date().dateFrom(13, 4, 2024, 12, 15),
endDate: Date().dateFrom(13, 4, 2024, 13, 15),
startDate: Date().dateFrom(15, 4, 2024, 2, 00),
endDate: Date().dateFrom(15, 4, 2024, 3, 00),
text: "Event 2",
backCol: "#3E56C2"
)

let event3 = CKEvent(
startDate: Date().dateFrom(13, 4, 2024, 12, 30),
endDate: Date().dateFrom(13, 4, 2024, 15, 01),
startDate: Date().dateFrom(16, 4, 2024, 3, 30),
endDate: Date().dateFrom(16, 4, 2024, 4, 30),
text: "Event 3",
backCol: "#F6D264"
)
Expand Down
17 changes: 9 additions & 8 deletions Sources/SwiftUiCalendarKit/Calendars/CKTimelineDay.swift
Original file line number Diff line number Diff line change
Expand Up @@ -51,20 +51,21 @@ public struct CKTimelineDay: View {
let eventData = CKUtils.generateEventViewData(
date: date,
events: events,
width: proxy.size.width - 65
width: proxy.size.width - 55
)

ForEach(eventData, id: \.self) { event in
CKEventView(
event,
observer: observer,
applyXOffset: false
)
ForEach(eventData, id: \.anyHashableID) { event in
if calendar.isDate(event.event.startDate, inSameDayAs: date) {
CKEventView(
event,
observer: observer,
weekView: false
)
}
}
}
}
}
.background(Color.white)
}
}
}
Expand Down
22 changes: 10 additions & 12 deletions Sources/SwiftUiCalendarKit/Calendars/CKTimelineWeek.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ public struct CKTimelineWeek: View {

timeline(proxy: proxy)
}
.background(Color.white)
}
}

Expand All @@ -53,21 +52,20 @@ public struct CKTimelineWeek: View {
let eventData = CKUtils.generateEventViewData(
date: date,
events: events,
width: ((proxy.size.width - CGFloat(90)) / 7)
width: ((proxy.size.width - CGFloat(55)) / 7)
)

ForEach(eventData, id: \.self) { event in
ForEach(eventData, id: \.anyHashableID) { event in
CKEventView(
event,
observer: observer,
applyXOffset: false,
startDay: calendar.firstDateOfWeek(week: date)
weekView: true
)
}

ForEach(1..<7) { day in

let offset: CGFloat = ((proxy.size.width - CGFloat(40)) / CGFloat(7)) * CGFloat(day)
let offset: CGFloat = ((proxy.size.width - CGFloat(55)) / CGFloat(7)) * CGFloat(day)

Rectangle()
.fill(Color.gray)
Expand All @@ -84,22 +82,22 @@ public struct CKTimelineWeek: View {
#Preview {

let event1 = CKEvent(
startDate: Date().dateFrom(16, 4, 2024, 12, 00),
endDate: Date().dateFrom(16, 4, 2024, 13, 00),
startDate: Date().dateFrom(14, 4, 2024, 1, 00),
endDate: Date().dateFrom(14, 4, 2024, 2, 00),
text: "Event 1",
backCol: "#D74D64"
)

let event2 = CKEvent(
startDate: Date().dateFrom(16, 4, 2024, 12, 15),
endDate: Date().dateFrom(16, 4, 2024, 13, 15),
startDate: Date().dateFrom(15, 4, 2024, 2, 00),
endDate: Date().dateFrom(15, 4, 2024, 3, 00),
text: "Event 2",
backCol: "#3E56C2"
)

let event3 = CKEvent(
startDate: Date().dateFrom(16, 4, 2024, 12, 30),
endDate: Date().dateFrom(16, 4, 2024, 15, 01),
startDate: Date().dateFrom(16, 4, 2024, 3, 30),
endDate: Date().dateFrom(16, 4, 2024, 4, 30),
text: "Event 3",
backCol: "#F6D264"
)
Expand Down
23 changes: 6 additions & 17 deletions Sources/SwiftUiCalendarKit/Components/CKCompactEventView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,39 +17,28 @@ struct CKCompactEventView<Detail: View>: View {


init(_ eventData: EventViewData,
@ViewBuilder detail: @escaping (any CKEventSchema) -> Detail,
applyXOffset: Bool,
startDay: Int? = 0)
@ViewBuilder detail: @escaping (any CKEventSchema) -> Detail)
{
self.detail = detail

self.eventData = eventData

self.event = eventData.event

if applyXOffset, let start = startDay {

if eventData.position > 1 {
xOffset = (eventData.eventWidth + 10) * (eventData.position - 1) + 55
} else {
xOffset = (CGFloat(eventData.day - start) * eventData.cellWidth) + 46
}
if eventData.position > 1 {
xOffset = ((eventData.eventWidth + 10) * (eventData.position - 1)) + 46
} else {
if eventData.position > 1 {
xOffset = (eventData.eventWidth + 10) * (eventData.position - 1) + 56
} else {
xOffset = 47
}
xOffset = 47
}
}

var body: some View {

VStack(alignment: .leading) {
VStack {
NavigationLink {
detail(event)
} label: {
VStack {
VStack(alignment: .leading) {
Text(event.startDate.formatted(.dateTime.hour().minute()))
Text(event.text).bold()
}
Expand Down
25 changes: 17 additions & 8 deletions Sources/SwiftUiCalendarKit/Components/CKEventView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,34 @@ struct CKEventView: View {

init(_ eventData: EventViewData,
observer: CKCalendarObserver,
applyXOffset: Bool,
startDay: Int? = 0)
weekView: Bool)
{

self.eventData = eventData
self._observer = .init(wrappedValue: observer)

self.event = eventData.event

if applyXOffset, let start = startDay {

let dayOfWeek = Date.dayOfWeek(event.startDate)

if weekView {

// WeekTimeline
if eventData.position > 1 {
xOffset = (eventData.eventWidth + 10) * (eventData.position - 1) + 55
let edgeOfDayCell = 47 + (eventData.cellWidth * CGFloat(dayOfWeek - 1))
xOffset = (edgeOfDayCell + ((eventData.position - 1) * (eventData.eventWidth + 5)))
} else {
xOffset = (CGFloat(eventData.day - start) * eventData.cellWidth) + 46
if dayOfWeek == 1 {
xOffset = 47
} else {
xOffset = 47 + (eventData.cellWidth * CGFloat(dayOfWeek - 1))
}
}
} else {

// Day Timeline
if eventData.position > 1 {
xOffset = (eventData.eventWidth + 10) * (eventData.position - 1) + 56
xOffset = 47 + (eventData.eventWidth + 5) * (eventData.position - 1)
} else {
xOffset = 47
}
Expand All @@ -52,7 +61,7 @@ struct CKEventView: View {
}
.font(.caption)
.foregroundColor(event.textAsColor())
.frame(maxWidth: eventData.eventWidth, alignment: .leading)
.frame(maxWidth: eventData.eventWidth - 5, alignment: .leading)
.padding(4)
.frame(height: eventData.height, alignment: .top)
.background(
Expand Down
8 changes: 8 additions & 0 deletions Sources/SwiftUiCalendarKit/Extensions/Date.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ extension Date {
) ?? self
}

static func dayOfWeek(_ date: Date) -> Int {

let calendar = Calendar.current
let dateComponents = calendar.dateComponents([.weekday], from: date)
return dateComponents.weekday ?? 0

}

func toString(_ format: String) -> String {
let formatter = DateFormatter()
formatter.dateFormat = format
Expand Down
27 changes: 13 additions & 14 deletions Sources/SwiftUiCalendarKit/Models/CKEventViewData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,22 @@

import SwiftUI

class EventViewData: Hashable {
class EventViewData: Identifiable {

static func == (lhs: EventViewData, rhs: EventViewData) -> Bool {
return lhs.id == rhs.id && lhs.id == rhs.id
}

func hash(into hasher: inout Hasher) {
hasher.combine(id)
hasher.combine(id)
}
// static func == (lhs: EventViewData, rhs: EventViewData) -> Bool {
// return lhs.id == rhs.id && lhs.id == rhs.id
// }
//
// func hash(into hasher: inout Hasher) {
// hasher.combine(id)
// hasher.combine(id)
// }

public typealias Id = UUID
let id = UUID()

public var anyHashableID: AnyHashable { AnyHashable(id) }

let calendar = Calendar(identifier: .gregorian)

let event: any CKEventSchema
Expand Down Expand Up @@ -52,11 +55,7 @@ class EventViewData: Hashable {
hour = calendar.component(.hour, from: event.startDate)
minute = calendar.component(.minute, from: event.startDate)

if position > 1 {
eventWidth = ((width - 20) / overlapsWith)
} else {
eventWidth = (width / overlapsWith)
}
eventWidth = (width / overlapsWith) - 5

yOffset = (Double(hour) * (CKTimeline.hourHeight)) + Double(minute)
}
Expand Down
6 changes: 1 addition & 5 deletions Sources/SwiftUiCalendarKit/Utils/CKUtils.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,7 @@ class CKUtils {
var pos5: [EventViewData] = []

for event in events {

if !calendar.isDate(event.startDate, inSameDayAs: date) {
continue
}


if !overLappings(event, pos1) {
pos1.append(EventViewData(event: event, overlapsWith: overLappingCount(event, events), position: 1, width: width))
} else if !overLappings(event, pos2) {
Expand Down

0 comments on commit d495f8d

Please sign in to comment.