mirror of
https://github.com/SimpleMobileTools/Simple-Calendar.git
synced 2025-02-02 19:57:15 +01:00
Handle drag all day event to regular and vice versa
This commit is contained in:
parent
0a8d8ae66c
commit
ce841864f6
@ -31,6 +31,7 @@ import com.simplemobiletools.commons.extensions.*
|
|||||||
import com.simplemobiletools.commons.helpers.*
|
import com.simplemobiletools.commons.helpers.*
|
||||||
import com.simplemobiletools.commons.views.MyTextView
|
import com.simplemobiletools.commons.views.MyTextView
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import kotlinx.android.synthetic.main.activity_event.event_all_day
|
||||||
import kotlinx.android.synthetic.main.fragment_week.*
|
import kotlinx.android.synthetic.main.fragment_week.*
|
||||||
import kotlinx.android.synthetic.main.fragment_week.view.*
|
import kotlinx.android.synthetic.main.fragment_week.view.*
|
||||||
import org.joda.time.DateTime
|
import org.joda.time.DateTime
|
||||||
@ -280,41 +281,47 @@ class WeekFragment : Fragment(), WeeklyCalendar {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DragEvent.ACTION_DRAG_EXITED -> {
|
DragEvent.ACTION_DRAG_EXITED -> {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DragEvent.ACTION_DRAG_LOCATION -> {
|
DragEvent.ACTION_DRAG_LOCATION -> {
|
||||||
|
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
DragEvent.ACTION_DROP -> {
|
DragEvent.ACTION_DROP -> {
|
||||||
val eventId = dragEvent.clipData.getItemAt(0).text.toString().toLong()
|
try {
|
||||||
val startHour = (dragEvent.y / rowHeight).toInt()
|
val eventId = dragEvent.clipData.getItemAt(0).text.toString().toLong()
|
||||||
val endHour = startHour + 1
|
val startHour = (dragEvent.y / rowHeight).toInt()
|
||||||
|
val endHour = startHour + 1
|
||||||
|
|
||||||
Log.d(TAG, "Dropped event: startHour=$startHour, endHour=$endHour")
|
Log.d(TAG, "Dropped event: startHour=$startHour, endHour=$endHour")
|
||||||
ensureBackgroundThread {
|
ensureBackgroundThread {
|
||||||
val event = context?.eventsDB?.getEventWithId(eventId)
|
val event = context?.eventsDB?.getEventWithId(eventId)
|
||||||
event?.let {
|
event?.let {
|
||||||
val startTime = Formatter.getDateTimeFromTS(it.startTS)
|
val startTime = Formatter.getDateTimeFromTS(it.startTS)
|
||||||
val endTime = Formatter.getDateTimeFromTS(it.endTS)
|
val endTime = Formatter.getDateTimeFromTS(it.endTS)
|
||||||
Log.w(TAG, "initGrid: found event: $it")
|
Log.w(TAG, "initGrid: found event: $it")
|
||||||
context?.eventsHelper?.updateEvent(
|
context?.eventsHelper?.updateEvent(
|
||||||
it.copy(
|
it.copy(
|
||||||
startTS = Formatter.getDateTimeFromTS(weekTimestamp + index * DAY_SECONDS).withTime(startHour, startTime.minuteOfHour, startTime.secondOfMinute, startTime.millisOfSecond).seconds(),
|
startTS = Formatter.getDateTimeFromTS(weekTimestamp + index * DAY_SECONDS)
|
||||||
endTS = Formatter.getDateTimeFromTS(weekTimestamp + index * DAY_SECONDS).withTime(endHour, endTime.minuteOfHour, endTime.secondOfMinute, endTime.millisOfSecond).seconds(),
|
.withTime(startHour, startTime.minuteOfHour, startTime.secondOfMinute, startTime.millisOfSecond).seconds(),
|
||||||
), true, false) {
|
endTS = Formatter.getDateTimeFromTS(weekTimestamp + index * DAY_SECONDS)
|
||||||
|
.withTime(endHour, endTime.minuteOfHour, endTime.secondOfMinute, endTime.millisOfSecond).seconds(),
|
||||||
|
flags = it.flags.removeBit(FLAG_ALL_DAY)
|
||||||
|
), true, false
|
||||||
|
) {
|
||||||
|
|
||||||
updateCalendar()
|
updateCalendar()
|
||||||
Log.w(TAG, "Updated event ${it.id}")
|
Log.w(TAG, "Updated event ${it.id}")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
true
|
||||||
|
} catch (ignored: Exception) {
|
||||||
|
false
|
||||||
}
|
}
|
||||||
true
|
|
||||||
}
|
}
|
||||||
DragEvent.ACTION_DRAG_ENDED -> {
|
DragEvent.ACTION_DRAG_ENDED -> {
|
||||||
|
|
||||||
@ -607,7 +614,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
|
|||||||
val allDaysLine = inflater.inflate(R.layout.all_day_events_holder_line, null, false) as RelativeLayout
|
val allDaysLine = inflater.inflate(R.layout.all_day_events_holder_line, null, false) as RelativeLayout
|
||||||
week_all_day_holder?.addView(allDaysLine)
|
week_all_day_holder?.addView(allDaysLine)
|
||||||
allDayHolders.add(allDaysLine)
|
allDayHolders.add(allDaysLine)
|
||||||
allDaysLine.setOnDragListener { view, dragEvent->
|
allDaysLine.setOnDragListener { view, dragEvent ->
|
||||||
when (dragEvent.action) {
|
when (dragEvent.action) {
|
||||||
DragEvent.ACTION_DRAG_STARTED -> {
|
DragEvent.ACTION_DRAG_STARTED -> {
|
||||||
dragEvent.clipDescription.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)
|
dragEvent.clipDescription.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)
|
||||||
@ -624,37 +631,44 @@ class WeekFragment : Fragment(), WeeklyCalendar {
|
|||||||
|
|
||||||
|
|
||||||
DragEvent.ACTION_DRAG_LOCATION -> {
|
DragEvent.ACTION_DRAG_LOCATION -> {
|
||||||
|
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
DragEvent.ACTION_DROP -> {
|
DragEvent.ACTION_DROP -> {
|
||||||
val eventId = dragEvent.clipData.getItemAt(0).text.toString().toLong()
|
try {
|
||||||
val startHour = (dragEvent.y / rowHeight).toInt()
|
val eventId = dragEvent.clipData.getItemAt(0).text.toString().toLong()
|
||||||
val endHour = startHour + 1
|
val xPos = dragEvent.x
|
||||||
|
val width = view.width
|
||||||
|
val dayCode = getDayCodeForAllDay(width, xPos.toInt())
|
||||||
|
Log.d(TAG, "addNewLine: dayCode=$dayCode")
|
||||||
|
val startStamp = Formatter.getDayStartTS(dayCode)
|
||||||
|
Log.d(TAG, "addNewLine: startStamp=$startStamp")
|
||||||
|
val endStamp = Formatter.getDayEndTS(dayCode)
|
||||||
|
Log.d(TAG, "addNewLine: endStamp=$endStamp")
|
||||||
|
|
||||||
Log.d(TAG, "Dropped event: startHour=$startHour, endHour=$endHour")
|
|
||||||
ensureBackgroundThread {
|
|
||||||
val event = context?.eventsDB?.getEventWithId(eventId)
|
|
||||||
event?.let {
|
|
||||||
val startTime = Formatter.getDateTimeFromTS(it.startTS)
|
|
||||||
val endTime = Formatter.getDateTimeFromTS(it.endTS)
|
|
||||||
Log.w(TAG, "initGrid: found event: $it")
|
|
||||||
context?.eventsHelper?.updateEvent(
|
|
||||||
it.copy(
|
|
||||||
startTS = Formatter.getDateTimeFromTS(weekTimestamp + index * DAY_SECONDS).withTime(startHour, startTime.minuteOfHour, startTime.secondOfMinute, startTime.millisOfSecond).seconds(),
|
|
||||||
endTS = Formatter.getDateTimeFromTS(weekTimestamp + index * DAY_SECONDS).withTime(endHour, endTime.minuteOfHour, endTime.secondOfMinute, endTime.millisOfSecond).seconds(),
|
|
||||||
), true, false) {
|
|
||||||
|
|
||||||
updateCalendar()
|
ensureBackgroundThread {
|
||||||
Log.w(TAG, "Updated event ${it.id}")
|
val event = context?.eventsDB?.getEventWithId(eventId)
|
||||||
|
event?.let {
|
||||||
|
Log.w(TAG, "addNewLine: found event: $it")
|
||||||
|
context?.eventsHelper?.updateEvent(
|
||||||
|
it.copy(
|
||||||
|
startTS = startStamp,
|
||||||
|
endTS = startStamp,
|
||||||
|
flags = it.flags.addBit(FLAG_ALL_DAY)
|
||||||
|
), true, false
|
||||||
|
) {
|
||||||
|
updateCalendar()
|
||||||
|
Log.w(TAG, "Updated event ${it.id}")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
true
|
||||||
|
} catch (ignored: Exception) {
|
||||||
|
false
|
||||||
}
|
}
|
||||||
true
|
|
||||||
}
|
}
|
||||||
DragEvent.ACTION_DRAG_ENDED -> {
|
DragEvent.ACTION_DRAG_ENDED -> {
|
||||||
|
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -665,6 +679,21 @@ class WeekFragment : Fragment(), WeeklyCalendar {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getDayCodeForAllDay(width: Int, xPos: Int): String {
|
||||||
|
Log.d(TAG, "getDayCodeForAllDay: width=$width, xPos=$xPos")
|
||||||
|
var index = 0
|
||||||
|
val widthPerDay = (width.toDouble() / config.weeklyViewDays.toDouble()).toInt()
|
||||||
|
Log.d(TAG, "getDayCodeForAllDay: widthPerDay=$widthPerDay")
|
||||||
|
for((valueIndex, value) in (widthPerDay until width step widthPerDay).withIndex()){
|
||||||
|
if(xPos < value){
|
||||||
|
index = valueIndex
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log.d(TAG, "getDayCodeForAllDay: $index")
|
||||||
|
return dayColumns[index].tag.toString()
|
||||||
|
}
|
||||||
|
|
||||||
private fun addCurrentTimeIndicator() {
|
private fun addCurrentTimeIndicator() {
|
||||||
if (todayColumnIndex != -1) {
|
if (todayColumnIndex != -1) {
|
||||||
val calendar = Calendar.getInstance()
|
val calendar = Calendar.getInstance()
|
||||||
@ -730,8 +759,19 @@ class WeekFragment : Fragment(), WeeklyCalendar {
|
|||||||
val startDateTime = Formatter.getDateTimeFromTS(event.startTS)
|
val startDateTime = Formatter.getDateTimeFromTS(event.startTS)
|
||||||
val endDateTime = Formatter.getDateTimeFromTS(event.endTS)
|
val endDateTime = Formatter.getDateTimeFromTS(event.endTS)
|
||||||
|
|
||||||
val minTS = Math.max(startDateTime.seconds(), weekTimestamp)
|
val startDateTimeSeconds = startDateTime.seconds()
|
||||||
val maxTS = Math.min(endDateTime.seconds(), weekTimestamp + 2 * WEEK_SECONDS)
|
val endDateTimeSeconds = endDateTime.seconds()
|
||||||
|
val weekTimestampStart = weekTimestamp
|
||||||
|
val weekTimestampEnd = weekTimestamp + 2 * WEEK_SECONDS
|
||||||
|
val minTS = Math.max(startDateTimeSeconds, weekTimestampStart)
|
||||||
|
val maxTS = Math.min(endDateTimeSeconds, weekTimestampEnd)
|
||||||
|
|
||||||
|
Log.d(TAG, "startDateTimeSeconds: $startDateTimeSeconds")
|
||||||
|
Log.d(TAG, "weekTimestampStart: $weekTimestampStart")
|
||||||
|
Log.d(TAG, "minTS: $minTS")
|
||||||
|
Log.d(TAG, "endDateTimeSeconds: $endDateTimeSeconds")
|
||||||
|
Log.d(TAG, "weekTimestampEnd: $weekTimestampEnd")
|
||||||
|
Log.d(TAG, "maxTS: $maxTS")
|
||||||
|
|
||||||
// fix a visual glitch with all-day events or events lasting multiple days starting at midnight on monday, being shown the previous week too
|
// fix a visual glitch with all-day events or events lasting multiple days starting at midnight on monday, being shown the previous week too
|
||||||
if (minTS == maxTS && (minTS - weekTimestamp == WEEK_SECONDS.toLong())) {
|
if (minTS == maxTS && (minTS - weekTimestamp == WEEK_SECONDS.toLong())) {
|
||||||
@ -740,9 +780,12 @@ class WeekFragment : Fragment(), WeeklyCalendar {
|
|||||||
|
|
||||||
val isStartTimeDay = Formatter.getDateTimeFromTS(maxTS) == Formatter.getDateTimeFromTS(maxTS).withTimeAtStartOfDay()
|
val isStartTimeDay = Formatter.getDateTimeFromTS(maxTS) == Formatter.getDateTimeFromTS(maxTS).withTimeAtStartOfDay()
|
||||||
val numDays = Days.daysBetween(Formatter.getDateTimeFromTS(minTS).toLocalDate(), Formatter.getDateTimeFromTS(maxTS).toLocalDate()).days
|
val numDays = Days.daysBetween(Formatter.getDateTimeFromTS(minTS).toLocalDate(), Formatter.getDateTimeFromTS(maxTS).toLocalDate()).days
|
||||||
|
Log.d(TAG, "numDays: $numDays")
|
||||||
val daysCnt = if (numDays == 1 && isStartTimeDay) 0 else numDays
|
val daysCnt = if (numDays == 1 && isStartTimeDay) 0 else numDays
|
||||||
|
Log.d(TAG, "daysCnt: $daysCnt")
|
||||||
val startDateTimeInWeek = Formatter.getDateTimeFromTS(minTS)
|
val startDateTimeInWeek = Formatter.getDateTimeFromTS(minTS)
|
||||||
val firstDayIndex = (startDateTimeInWeek.dayOfWeek - if (config.isSundayFirst) 0 else 1) % 7
|
val firstDayIndex = (startDateTimeInWeek.dayOfWeek - if (config.isSundayFirst) 0 else 1) % 7
|
||||||
|
Log.d(TAG, "firstDayIndex: $firstDayIndex")
|
||||||
|
|
||||||
var doesEventFit: Boolean
|
var doesEventFit: Boolean
|
||||||
val cnt = allDayRows.size - 1
|
val cnt = allDayRows.size - 1
|
||||||
@ -781,6 +824,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
|
|||||||
val dayCodeStart = Formatter.getDayCodeFromDateTime(startDateTime).toInt()
|
val dayCodeStart = Formatter.getDayCodeFromDateTime(startDateTime).toInt()
|
||||||
val dayCodeEnd = Formatter.getDayCodeFromDateTime(endDateTime).toInt()
|
val dayCodeEnd = Formatter.getDayCodeFromDateTime(endDateTime).toInt()
|
||||||
val dayOfWeek = dayColumns.indexOfFirst { it.tag.toInt() == dayCodeStart || (it.tag.toInt() > dayCodeStart && it.tag.toInt() <= dayCodeEnd) }
|
val dayOfWeek = dayColumns.indexOfFirst { it.tag.toInt() == dayCodeStart || (it.tag.toInt() > dayCodeStart && it.tag.toInt() <= dayCodeEnd) }
|
||||||
|
Log.i(TAG, "dayOfWeek: $dayOfWeek")
|
||||||
if (dayOfWeek == -1) {
|
if (dayOfWeek == -1) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user