implementing the first part of solving weekly view event overlapping

This commit is contained in:
tibbi 2019-02-14 15:34:11 +01:00
parent 1f52643556
commit e7f7e24bdf
2 changed files with 56 additions and 4 deletions

View File

@ -5,6 +5,7 @@ import android.content.res.Resources
import android.graphics.Rect import android.graphics.Rect
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.os.Bundle import android.os.Bundle
import android.util.Range
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MotionEvent import android.view.MotionEvent
import android.view.View import android.view.View
@ -24,6 +25,7 @@ import com.simplemobiletools.calendar.pro.helpers.Formatter
import com.simplemobiletools.calendar.pro.interfaces.WeekFragmentListener import com.simplemobiletools.calendar.pro.interfaces.WeekFragmentListener
import com.simplemobiletools.calendar.pro.interfaces.WeeklyCalendar import com.simplemobiletools.calendar.pro.interfaces.WeeklyCalendar
import com.simplemobiletools.calendar.pro.models.Event import com.simplemobiletools.calendar.pro.models.Event
import com.simplemobiletools.calendar.pro.models.EventWeeklyView
import com.simplemobiletools.calendar.pro.views.MyScrollView import com.simplemobiletools.calendar.pro.views.MyScrollView
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.DAY_SECONDS import com.simplemobiletools.commons.helpers.DAY_SECONDS
@ -57,6 +59,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
private var allDayHolders = ArrayList<RelativeLayout>() private var allDayHolders = ArrayList<RelativeLayout>()
private var allDayRows = ArrayList<HashSet<Int>>() private var allDayRows = ArrayList<HashSet<Int>>()
private var eventTypeColors = LongSparseArray<Int>() private var eventTypeColors = LongSparseArray<Int>()
private var eventTimeRanges = LinkedHashMap<String, ArrayList<EventWeeklyView>>()
private lateinit var inflater: LayoutInflater private lateinit var inflater: LayoutInflater
private lateinit var mView: View private lateinit var mView: View
@ -242,6 +245,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
initGrid() initGrid()
allDayHolders.clear() allDayHolders.clear()
allDayRows.clear() allDayRows.clear()
eventTimeRanges.clear()
allDayRows.add(HashSet()) allDayRows.add(HashSet())
week_all_day_holder?.removeAllViews() week_all_day_holder?.removeAllViews()
@ -250,22 +254,55 @@ class WeekFragment : Fragment(), WeeklyCalendar {
val fullHeight = mRes.getDimension(R.dimen.weekly_view_events_height) val fullHeight = mRes.getDimension(R.dimen.weekly_view_events_height)
val minuteHeight = fullHeight / (24 * 60) val minuteHeight = fullHeight / (24 * 60)
val minimalHeight = mRes.getDimension(R.dimen.weekly_view_minimal_event_height).toInt() val minimalHeight = mRes.getDimension(R.dimen.weekly_view_minimal_event_height).toInt()
val density = Math.round(context!!.resources.displayMetrics.density)
var hadAllDayEvent = false var hadAllDayEvent = false
val replaceDescription = mConfig.replaceDescription val replaceDescription = mConfig.replaceDescription
val sorted = events.sortedWith(compareBy({ it.startTS }, { it.endTS }, { it.title }, { if (replaceDescription) it.location else it.description })) val sorted = events.sortedWith(compareBy({ it.startTS }, { it.endTS }, { it.title }, { if (replaceDescription) it.location else it.description }))
for (event in sorted) { for (event in sorted) {
if (event.getIsAllDay() || Formatter.getDayCodeFromTS(event.startTS) != Formatter.getDayCodeFromTS(event.endTS)) { val startDateTime = Formatter.getDateTimeFromTS(event.startTS)
val endDateTime = Formatter.getDateTimeFromTS(event.endTS)
if (!event.getIsAllDay() && Formatter.getDayCodeFromDateTime(startDateTime) == Formatter.getDayCodeFromDateTime(endDateTime)) {
val startMinutes = startDateTime.minuteOfDay
val duration = endDateTime.minuteOfDay - startMinutes
val range = Range(startMinutes, startMinutes + duration)
val eventWeekly = EventWeeklyView(event.id!!, range)
val dayCode = Formatter.getDayCodeFromDateTime(startDateTime)
if (!eventTimeRanges.containsKey(dayCode)) {
eventTimeRanges[dayCode] = ArrayList()
}
eventTimeRanges[dayCode]?.add(eventWeekly)
}
}
for (event in sorted) {
val startDateTime = Formatter.getDateTimeFromTS(event.startTS)
val endDateTime = Formatter.getDateTimeFromTS(event.endTS)
if (event.getIsAllDay() || Formatter.getDayCodeFromDateTime(startDateTime) != Formatter.getDayCodeFromDateTime(endDateTime)) {
hadAllDayEvent = true hadAllDayEvent = true
addAllDayEvent(event) addAllDayEvent(event)
} else { } else {
val startDateTime = Formatter.getDateTimeFromTS(event.startTS)
val endDateTime = Formatter.getDateTimeFromTS(event.endTS)
val dayOfWeek = startDateTime.plusDays(if (mConfig.isSundayFirst) 1 else 0).dayOfWeek - 1 val dayOfWeek = startDateTime.plusDays(if (mConfig.isSundayFirst) 1 else 0).dayOfWeek - 1
val layout = getColumnWithId(dayOfWeek) val layout = getColumnWithId(dayOfWeek)
val startMinutes = startDateTime.minuteOfDay val startMinutes = startDateTime.minuteOfDay
val duration = endDateTime.minuteOfDay - startMinutes val duration = endDateTime.minuteOfDay - startMinutes
val range = Range(startMinutes, startMinutes + duration)
val dayCode = Formatter.getDayCodeFromDateTime(startDateTime)
var overlappingEvents = 0
var currentEventOverlapIndex = 0
eventTimeRanges[dayCode]!!.forEachIndexed { index, eventWeeklyView ->
if (eventWeeklyView.range.contains(range)) {
overlappingEvents++
}
if (eventWeeklyView.id == event.id) {
currentEventOverlapIndex = index
}
}
(inflater.inflate(R.layout.week_event_marker, null, false) as TextView).apply { (inflater.inflate(R.layout.week_event_marker, null, false) as TextView).apply {
var backgroundColor = eventTypeColors.get(event.eventType, primaryColor) var backgroundColor = eventTypeColors.get(event.eventType, primaryColor)
@ -282,11 +319,21 @@ class WeekFragment : Fragment(), WeeklyCalendar {
y = startMinutes * minuteHeight y = startMinutes * minuteHeight
(layoutParams as RelativeLayout.LayoutParams).apply { (layoutParams as RelativeLayout.LayoutParams).apply {
width = layout.width - 1 width = layout.width - 1
width /= overlappingEvents
x = width * currentEventOverlapIndex.toFloat()
if (overlappingEvents > 1) {
if (currentEventOverlapIndex + 1 == overlappingEvents) {
x += density
} else {
width -= density
}
}
minHeight = if (event.startTS == event.endTS) minimalHeight else (duration * minuteHeight).toInt() - 1 minHeight = if (event.startTS == event.endTS) minimalHeight else (duration * minuteHeight).toInt() - 1
} }
setOnClickListener { setOnClickListener {
Intent(context, EventActivity::class.java).apply { Intent(context, EventActivity::class.java).apply {
putExtra(EVENT_ID, event.id) putExtra(EVENT_ID, event.id!!)
putExtra(EVENT_OCCURRENCE_TS, event.startTS) putExtra(EVENT_OCCURRENCE_TS, event.startTS)
startActivity(this) startActivity(this)
} }

View File

@ -0,0 +1,5 @@
package com.simplemobiletools.calendar.pro.models
import android.util.Range
data class EventWeeklyView(val id: Long, val range: Range<Int>)