Skip to content

Commit

Permalink
Merge pull request #356 from rakuyoMo/feature/disable-add-event-delegate
Browse files Browse the repository at this point in the history
  • Loading branch information
kvyatkovskys authored Jun 14, 2024
2 parents 82243ce + 23e6e29 commit f933a4c
Show file tree
Hide file tree
Showing 9 changed files with 75 additions and 34 deletions.
7 changes: 6 additions & 1 deletion Sources/KVKCalendar/CalendarModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -542,6 +542,9 @@ public protocol CalendarDelegate: AnyObject {
/// drag & drop events and resize
func didChangeEvent(_ event: Event, start: Date?, end: Date?)

/// Controls whether event can be added
func willAddNewEvent(_ event: Event, _ date: Date?) -> Bool

/// add new event
func didAddNewEvent(_ event: Event, _ date: Date?)

Expand Down Expand Up @@ -582,7 +585,9 @@ public extension CalendarDelegate {
func eventViewerFrame(_ frame: CGRect) {}

func didChangeEvent(_ event: Event, start: Date?, end: Date?) {}


func willAddNewEvent(_ event: Event, _ date: Date?) -> Bool { true }

func didAddNewEvent(_ event: Event, _ date: Date?) {}

func didDisplayEvents(_ events: [Event], dates: [Date?]) {}
Expand Down
15 changes: 13 additions & 2 deletions Sources/KVKCalendar/DayView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import UIKit

final class DayView: UIView {
public final class DayView: UIView {

private var parameters: Parameters
private let tagEventViewer = -10
Expand All @@ -29,7 +29,7 @@ final class DayView: UIView {
type: .day,
style: Style()))

var timelinePage = TimelinePageView(maxLimit: 0, pages: [], frame: .zero)
public var timelinePage = TimelinePageView(maxLimit: 0, pages: [], frame: .zero)

private var topBackgroundView = UIView()
private var isAvailableEventViewer: Bool {
Expand Down Expand Up @@ -129,6 +129,17 @@ extension DayView: TimelineDelegate {
delegate?.didChangeEvent(event, start: startDate, end: endDate)
}

func willAddNewEvent(_ event: Event, minute: Int, hour: Int, point: CGPoint) -> Bool {
var components = DateComponents()
components.year = parameters.data.date.kvkYear
components.month = parameters.data.date.kvkMonth
components.day = parameters.data.date.kvkDay
components.hour = hour
components.minute = minute
let date = style.calendar.date(from: components)
return delegate?.willAddNewEvent(event, date) ?? true
}

func didAddNewEvent(_ event: Event, minute: Int, hour: Int, point: CGPoint) {
var components = DateComponents()
components.year = parameters.data.date.kvkYear
Expand Down
4 changes: 4 additions & 0 deletions Sources/KVKCalendar/KVKCalendarView+Extension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,10 @@ extension KVKCalendarView: DisplayDelegate {
delegate?.didSelectMore(date, frame: frame)
}

public func willAddNewEvent(_ event: Event, _ date: Date?) -> Bool {
delegate?.willAddNewEvent(event, date) ?? true
}

public func didAddNewEvent(_ event: Event, _ date: Date?) {
delegate?.didAddNewEvent(event, date)
}
Expand Down
2 changes: 1 addition & 1 deletion Sources/KVKCalendar/KVKCalendarView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public final class KVKCalendarView: UIView {
private(set) var yearData: YearData
private let listData: ListViewData

private(set) var dayView: DayView
public private(set) var dayView: DayView
private(set) var weekView: WeekView
private(set) var monthView: MonthView
private(set) var yearView: YearView
Expand Down
38 changes: 21 additions & 17 deletions Sources/KVKCalendar/Timeline+Extension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ extension TimelineView: UIScrollViewDelegate {
}
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
addStubForInvisibleEvents()
}

Expand Down Expand Up @@ -201,7 +201,7 @@ extension TimelineView {
enableAllEvents(enable: true)
}

private func enableAllEvents(enable: Bool) {
public func enableAllEvents(enable: Bool) {
if style.allDay.isPinned {
subviews.filter { $0.tag == tagAllDayEventView }.forEach { $0.isUserInteractionEnabled = enable }
} else {
Expand Down Expand Up @@ -316,7 +316,7 @@ extension TimelineView {
return allDayView
}

func getTimelineLabel(hour: Int) -> TimelineLabel? {
public func getTimelineLabel(hour: Int) -> TimelineLabel? {
timeLabels.first(where: { $0.hashTime == hour })
}

Expand Down Expand Up @@ -409,10 +409,6 @@ extension TimelineView {
}

@objc func addNewEvent(gesture: UILongPressGestureRecognizer) {
guard !isResizableEventEnable else { return }
if gesture.state == .began {
eventPreviewSize = getEventPreviewSize()
}
var point = gesture.location(in: scrollView)
if style.timeline.createEventAtTouch && !style.event.states.contains(.move) {
let offset = eventPreviewYOffset - style.timeline.offsetEvent - 6
Expand All @@ -423,6 +419,24 @@ extension TimelineView {
let time = movingMinuteLabel.time
var newEvent = Event(ID: Event.idForNewEvent)
newEvent.title = TextEvent(timeline: style.event.textForNewEvent)

switch paramaters.type {
case .day:
newEvent.start = selectedDate
case .week:
newEvent.start = shadowView.date ?? Date()
default:
break
}

newEvent.end = style.calendar.date(byAdding: .minute, value: style.event.newEventStep, to: newEvent.start) ?? Date()

guard !isResizableEventEnable && (delegate?.willAddNewEvent(newEvent, minute: time.minute, hour: time.hour, point: point) ?? true) else { return }

if gesture.state == .began {
eventPreviewSize = getEventPreviewSize()
}

let newEventPreview = getEventView(style: style,
event: newEvent,
frame: CGRect(origin: point, size: eventPreviewSize))
Expand All @@ -436,16 +450,6 @@ extension TimelineView {
case .ended, .failed, .cancelled:
UIImpactFeedbackGenerator(style: .light).impactOccurred()

switch paramaters.type {
case .day:
newEvent.start = selectedDate
case .week:
newEvent.start = shadowView.date ?? Date()
default:
break
}

newEvent.end = style.calendar.date(byAdding: .minute, value: style.event.newEventStep, to: newEvent.start) ?? Date()
delegate?.didAddNewEvent(newEvent,
minute: time.minute,
hour: time.hour,
Expand Down
12 changes: 9 additions & 3 deletions Sources/KVKCalendar/TimelineModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,14 @@

import UIKit

struct TimeContainer {
var minute: Int
var hour: Int
public struct TimeContainer {
public var minute: Int
public var hour: Int

public init(minute: Int, hour: Int) {
self.minute = minute
self.hour = hour
}
}

typealias ResizeTime = (hour: Int, minute: Int)
Expand All @@ -23,6 +28,7 @@ protocol TimelineDelegate: AnyObject {
func previousDate()
func swipeX(transform: CGAffineTransform, stop: Bool)
func didChangeEvent(_ event: Event, minute: Int, hour: Int, point: CGPoint, newDate: Date?)
func willAddNewEvent(_ event: Event, minute: Int, hour: Int, point: CGPoint) -> Bool
func didAddNewEvent(_ event: Event, minute: Int, hour: Int, point: CGPoint)
func didResizeEvent(_ event: Event, startTime: ResizeTime, endTime: ResizeTime)
func dequeueTimeLabel(_ label: TimelineLabel) -> (current: TimelineLabel, others: [UILabel])?
Expand Down
12 changes: 6 additions & 6 deletions Sources/KVKCalendar/TimelinePageView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import UIKit

final class TimelinePageView: UIView {
public final class TimelinePageView: UIView {

enum SwitchPageType: Int {
case next, previous
Expand All @@ -35,7 +35,7 @@ final class TimelinePageView: UIView {
var didSwitchTimelineView: ((TimelineView?, SwitchPageType) -> Void)?
var willDisplayTimelineView: ((TimelineView, SwitchPageType) -> Void)?

var timelineView: TimelineView? {
public var timelineView: TimelineView? {
pages[currentIndex]
}

Expand Down Expand Up @@ -156,14 +156,14 @@ final class TimelinePageView: UIView {

extension TimelinePageView: UIPageViewControllerDataSource, UIPageViewControllerDelegate {

func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
public func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
guard let vc = pendingViewControllers.first as? TimelineContainerVC, let contentOffset = timelineView?.contentOffset else { return }

let pendingTimelineView = pages[vc.index]
pendingTimelineView?.contentOffset = contentOffset
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard var newIndex = (viewController as? TimelineContainerVC)?.index, isPagingEnabled else { return nil }

newIndex -= 1
Expand All @@ -178,7 +178,7 @@ extension TimelinePageView: UIPageViewControllerDataSource, UIPageViewController
return container
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard var newIndex = (viewController as? TimelineContainerVC)?.index, isPagingEnabled else { return nil }

newIndex += 1
Expand All @@ -193,7 +193,7 @@ extension TimelinePageView: UIPageViewControllerDataSource, UIPageViewController
return container
}

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
public func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
guard let index = (pageViewController.viewControllers?.first as? TimelineContainerVC)?.index, completed else { return }

let type: SwitchPageType
Expand Down
8 changes: 4 additions & 4 deletions Sources/KVKCalendar/TimelineView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import UIKit

final class TimelineView: UIView, EventDateProtocol, CalendarTimer {
public final class TimelineView: UIView, EventDateProtocol, CalendarTimer {

struct Parameters {
var style: Style
Expand Down Expand Up @@ -61,7 +61,7 @@ final class TimelineView: UIView, EventDateProtocol, CalendarTimer {
private let tagBackgroundView = -50
private(set) var tagAllDayEventView = -70
private(set) var tagStubEvent = -80
private(set) var timeLabels = [TimelineLabel]()
public private(set) var timeLabels = [TimelineLabel]()
private(set) var timeSystem: TimeHourSystem
private let timerKey = "CurrentHourTimerKey"
private(set) var events = [Event]()
Expand All @@ -78,7 +78,7 @@ final class TimelineView: UIView, EventDateProtocol, CalendarTimer {
return view
}()

private(set) lazy var movingMinuteLabel: TimelineLabel = {
public private(set) lazy var movingMinuteLabel: TimelineLabel = {
let label = TimelineLabel()
label.adjustsFontSizeToFitWidth = true
label.textColor = style.timeline.movingMinutesColor
Expand All @@ -95,7 +95,7 @@ final class TimelineView: UIView, EventDateProtocol, CalendarTimer {
return view
}()

private(set) lazy var scrollView: UIScrollView = {
public private(set) lazy var scrollView: UIScrollView = {
let scroll = UIScrollView()
scroll.delegate = self
return scroll
Expand Down
11 changes: 11 additions & 0 deletions Sources/KVKCalendar/WeekView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,17 @@ extension WeekView: TimelineDelegate {
delegate?.didChangeEvent(event, start: startDate, end: endDate)
}

func willAddNewEvent(_ event: Event, minute: Int, hour: Int, point: CGPoint) -> Bool {
var components = DateComponents()
components.year = event.start.kvkYear
components.month = event.start.kvkMonth
components.day = event.start.kvkDay
components.hour = hour
components.minute = minute
let newDate = style.calendar.date(from: components)
return delegate?.willAddNewEvent(event, newDate) ?? true
}

func didAddNewEvent(_ event: Event, minute: Int, hour: Int, point: CGPoint) {
var components = DateComponents()
components.year = event.start.kvkYear
Expand Down

0 comments on commit f933a4c

Please sign in to comment.