154 lines
5.3 KiB
Kotlin
154 lines
5.3 KiB
Kotlin
/*
|
|
* Copyright (C) 2021 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package com.android.calendar
|
|
|
|
import android.graphics.Rect
|
|
|
|
class EventGeometry {
|
|
// This is the space from the grid line to the event rectangle.
|
|
private var mCellMargin = 0
|
|
private var mMinuteHeight = 0f
|
|
private var mHourGap = 0f
|
|
private var mMinEventHeight = 0f
|
|
fun setCellMargin(cellMargin: Int) {
|
|
mCellMargin = cellMargin
|
|
}
|
|
|
|
fun setHourGap(gap: Float) {
|
|
mHourGap = gap
|
|
}
|
|
|
|
fun setMinEventHeight(height: Float) {
|
|
mMinEventHeight = height
|
|
}
|
|
|
|
fun setHourHeight(height: Float) {
|
|
mMinuteHeight = height / 60.0f
|
|
}
|
|
|
|
// Computes the rectangle coordinates of the given event on the screen.
|
|
// Returns true if the rectangle is visible on the screen.
|
|
fun computeEventRect(date: Int, left: Int, top: Int, cellWidth: Int, event: Event): Boolean {
|
|
if (event.drawAsAllday()) {
|
|
return false
|
|
}
|
|
val cellMinuteHeight = mMinuteHeight
|
|
val startDay: Int = event.startDay
|
|
val endDay: Int = event.endDay
|
|
if (startDay > date || endDay < date) {
|
|
return false
|
|
}
|
|
var startTime: Int = event.startTime
|
|
var endTime: Int = event.endTime
|
|
|
|
// If the event started on a previous day, then show it starting
|
|
// at the beginning of this day.
|
|
if (startDay < date) {
|
|
startTime = 0
|
|
}
|
|
|
|
// If the event ends on a future day, then show it extending to
|
|
// the end of this day.
|
|
if (endDay > date) {
|
|
endTime = DayView.MINUTES_PER_DAY
|
|
}
|
|
val col: Int = event.column
|
|
val maxCols: Int = event.maxColumns
|
|
val startHour = startTime / 60
|
|
var endHour = endTime / 60
|
|
|
|
// If the end point aligns on a cell boundary then count it as
|
|
// ending in the previous cell so that we don't cross the border
|
|
// between hours.
|
|
if (endHour * 60 == endTime) endHour -= 1
|
|
event.top = top as Float
|
|
event.top += (startTime * cellMinuteHeight).toInt()
|
|
event.top += startHour * mHourGap
|
|
event.bottom = top as Float
|
|
event.bottom += (endTime * cellMinuteHeight).toInt()
|
|
event.bottom += endHour * mHourGap - 1
|
|
|
|
// Make the rectangle be at least mMinEventHeight pixels high
|
|
if (event.bottom < event.top + mMinEventHeight) {
|
|
event.bottom = event.top + mMinEventHeight
|
|
}
|
|
val colWidth = (cellWidth - (maxCols + 1) * mCellMargin).toFloat() / maxCols.toFloat()
|
|
event.left = left + col * (colWidth + mCellMargin)
|
|
event.right = event.left + colWidth
|
|
return true
|
|
}
|
|
|
|
/**
|
|
* Returns true if this event intersects the selection region.
|
|
*/
|
|
fun eventIntersectsSelection(event: Event, selection: Rect): Boolean {
|
|
return if (event.left < selection.right && event.right >= selection.left &&
|
|
event.top < selection.bottom && event.bottom >= selection.top) {
|
|
true
|
|
} else false
|
|
}
|
|
|
|
/**
|
|
* Computes the distance from the given point to the given event.
|
|
*/
|
|
fun pointToEvent(x: Float, y: Float, event: Event): Float {
|
|
val left: Float = event.left
|
|
val right: Float = event.right
|
|
val top: Float = event.top
|
|
val bottom: Float = event.bottom
|
|
if (x >= left) {
|
|
if (x <= right) {
|
|
return if (y >= top) {
|
|
if (y <= bottom) {
|
|
// x,y is inside the event rectangle
|
|
0f
|
|
} else y - bottom
|
|
// x,y is below the event rectangle
|
|
} else top - y
|
|
// x,y is above the event rectangle
|
|
}
|
|
|
|
// x > right
|
|
val dx = x - right
|
|
if (y < top) {
|
|
// the upper right corner
|
|
val dy = top - y
|
|
return (Math.sqrt(dx as Double * dx + dy as Double * dy)) as Float
|
|
}
|
|
if (y > bottom) {
|
|
// the lower right corner
|
|
val dy = y - bottom
|
|
return (Math.sqrt(dx as Double * dx + dy as Double * dy)) as Float
|
|
}
|
|
// x,y is to the right of the event rectangle
|
|
return dx
|
|
}
|
|
// x < left
|
|
val dx = left - x
|
|
if (y < top) {
|
|
// the upper left corner
|
|
val dy = top - y
|
|
return (Math.sqrt(dx as Double * dx + dy as Double * dy)) as Float
|
|
}
|
|
if (y > bottom) {
|
|
// the lower left corner
|
|
val dy = y - bottom
|
|
return (Math.sqrt(dx as Double * dx + dy as Double * dy)) as Float
|
|
}
|
|
// x,y is to the left of the event rectangle
|
|
return dx
|
|
}
|
|
} |