mirror of
https://github.com/SimpleMobileTools/Simple-Calendar.git
synced 2025-06-05 21:59:17 +02:00
Properly handle repeating events
This commit is contained in:
@@ -115,16 +115,17 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun groupAllEvents() {
|
private fun groupAllEvents() {
|
||||||
days.forEach {
|
days.forEach { day ->
|
||||||
val day = it
|
|
||||||
day.dayEvents.forEach {
|
|
||||||
val event = it
|
|
||||||
|
|
||||||
|
day.dayEvents.forEach { event ->
|
||||||
// make sure we properly handle events lasting multiple days and repeating ones
|
// make sure we properly handle events lasting multiple days and repeating ones
|
||||||
val lastEvent = allEvents.lastOrNull { it.id == event.id }
|
val lastEvent = allEvents.lastOrNull { it.id == event.id }
|
||||||
val daysCnt = getEventLastingDaysCount(event)
|
val daysCnt = getEventLastingDaysCount(event)
|
||||||
val validDayEvent = isDayValid(event, day.code)
|
val validDayEvent = isDayValid(event, day.code)
|
||||||
if ((lastEvent == null || lastEvent.startDayIndex + daysCnt <= day.indexOnMonthView) && !validDayEvent) {
|
|
||||||
|
val lastDay = { findLastDay(event) ?: day }
|
||||||
|
|
||||||
|
if ((lastEvent == null || lastEvent.startDayIndex + daysCnt <= lastDay().indexOnMonthView) && !validDayEvent) {
|
||||||
val monthViewEvent = MonthViewEvent(
|
val monthViewEvent = MonthViewEvent(
|
||||||
event.id!!, event.title, event.startTS, event.endTS, event.color, day.indexOnMonthView,
|
event.id!!, event.title, event.startTS, event.endTS, event.color, day.indexOnMonthView,
|
||||||
daysCnt, day.indexOnMonthView, event.getIsAllDay(), event.isPastEvent, event.isTask(), event.isTaskCompleted()
|
daysCnt, day.indexOnMonthView, event.getIsAllDay(), event.isPastEvent, event.isTask(), event.isTaskCompleted()
|
||||||
@@ -135,8 +136,9 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
|||||||
}
|
}
|
||||||
|
|
||||||
allEvents =
|
allEvents =
|
||||||
allEvents.asSequence().sortedWith(compareBy({ -it.daysCnt }, { !it.isAllDay }, { it.startTS }, { it.endTS }, { it.startDayIndex }, { it.title }))
|
allEvents.asSequence().sortedWith(
|
||||||
.toMutableList() as ArrayList<MonthViewEvent>
|
compareBy({ -it.daysCnt }, { !it.isAllDay }, { it.startTS }, { it.endTS }, { it.startDayIndex }, { it.title })
|
||||||
|
).toMutableList() as ArrayList<MonthViewEvent>
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDraw(canvas: Canvas) {
|
override fun onDraw(canvas: Canvas) {
|
||||||
@@ -287,7 +289,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
|||||||
}
|
}
|
||||||
|
|
||||||
val startDayIndex = days[event.originalStartDayIndex]
|
val startDayIndex = days[event.originalStartDayIndex]
|
||||||
val endDayIndex = days[Math.min(event.startDayIndex + event.daysCnt - 1, 41)]
|
val endDayIndex = days[min(event.startDayIndex + event.daysCnt - 1, 41)]
|
||||||
bgRectF.set(bgLeft, bgTop, bgRight, bgBottom)
|
bgRectF.set(bgLeft, bgTop, bgRight, bgBottom)
|
||||||
canvas.drawRoundRect(bgRectF, BG_CORNER_RADIUS, BG_CORNER_RADIUS, getEventBackgroundColor(event, startDayIndex, endDayIndex))
|
canvas.drawRoundRect(bgRectF, BG_CORNER_RADIUS, BG_CORNER_RADIUS, getEventBackgroundColor(event, startDayIndex, endDayIndex))
|
||||||
|
|
||||||
@@ -303,7 +305,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
|||||||
|
|
||||||
drawEventTitle(event, canvas, xPos + taskIconWidth, yPos + verticalOffset, bgRight - bgLeft - smallPadding - taskIconWidth, specificEventTitlePaint)
|
drawEventTitle(event, canvas, xPos + taskIconWidth, yPos + verticalOffset, bgRight - bgLeft - smallPadding - taskIconWidth, specificEventTitlePaint)
|
||||||
|
|
||||||
for (i in 0 until Math.min(event.daysCnt, 7 - event.startDayIndex % 7)) {
|
for (i in 0 until min(event.daysCnt, 7 - event.startDayIndex % 7)) {
|
||||||
dayVerticalOffsets.put(event.startDayIndex + i, verticalOffset + eventTitleHeight + smallPadding * 2)
|
dayVerticalOffsets.put(event.startDayIndex + i, verticalOffset + eventTitleHeight + smallPadding * 2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -431,6 +433,11 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
|||||||
return event.startTS != event.endTS && Formatter.getDateTimeFromTS(event.endTS) == Formatter.getDateTimeFromTS(date.seconds()).withTimeAtStartOfDay()
|
return event.startTS != event.endTS && Formatter.getDateTimeFromTS(event.endTS) == Formatter.getDateTimeFromTS(date.seconds()).withTimeAtStartOfDay()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun findLastDay(event: Event) =
|
||||||
|
days.lastOrNull { day ->
|
||||||
|
day.dayEvents.find { it.id == event.id } != null
|
||||||
|
}
|
||||||
|
|
||||||
fun togglePrintMode() {
|
fun togglePrintMode() {
|
||||||
isPrintVersion = !isPrintVersion
|
isPrintVersion = !isPrintVersion
|
||||||
textColor = if (isPrintVersion) {
|
textColor = if (isPrintVersion) {
|
||||||
|
@@ -59,7 +59,10 @@ class MonthViewWrapper(context: Context, attrs: AttributeSet, defStyle: Int) : F
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
child.measure(MeasureSpec.makeMeasureSpec(dayWidth.toInt(), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dayHeight.toInt(), MeasureSpec.EXACTLY))
|
child.measure(
|
||||||
|
MeasureSpec.makeMeasureSpec(dayWidth.toInt(), MeasureSpec.EXACTLY),
|
||||||
|
MeasureSpec.makeMeasureSpec(dayHeight.toInt(), MeasureSpec.EXACTLY)
|
||||||
|
)
|
||||||
|
|
||||||
val childLeft = x * dayWidth + horizontalOffset - child.translationX
|
val childLeft = x * dayWidth + horizontalOffset - child.translationX
|
||||||
val childTop = y * dayHeight + weekDaysLetterHeight - child.translationY
|
val childTop = y * dayHeight + weekDaysLetterHeight - child.translationY
|
||||||
|
Reference in New Issue
Block a user