Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 51 additions & 51 deletions core/src/main/java/com/alamkanak/weekview/HeaderRenderer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,19 @@ import android.text.TextPaint
import android.util.SparseArray
import androidx.collection.ArrayMap
import androidx.core.content.ContextCompat
import java.util.Calendar
import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.temporal.ChronoUnit
import java.util.*
import kotlin.math.roundToInt

internal class HeaderRenderer(
context: Context,
viewState: ViewState,
eventChipsCacheProvider: EventChipsCacheProvider,
onHeaderHeightChanged: () -> Unit
onHeaderHeightChanged: () -> Unit,
private var beginWeekCalendar: Calendar? = null
) : Renderer, DateFormatterDependent {

private val allDayEventLabels = ArrayMap<EventChip, StaticLayout>()
Expand Down Expand Up @@ -48,7 +53,8 @@ internal class HeaderRenderer(

private val headerDrawer = HeaderDrawer(
context = context,
viewState = viewState
viewState = viewState,
beginWeekCalendar = this.beginWeekCalendar
)

override fun onSizeChanged(width: Int, height: Int) {
Expand Down Expand Up @@ -139,43 +145,20 @@ private class DateLabelsDrawer(
) : Drawer {

override fun draw(canvas: Canvas) {
if (viewState.numberOfVisibleDays > 1) {
canvas.drawDateLabelInMultiDayView()
} else {
canvas.drawDateLabelInSingleDayView()
}
}

private fun Canvas.drawDateLabelInSingleDayView() {
val bounds = viewState.weekNumberBounds
val date = viewState.dateRange.first()

val key = date.toEpochDays()
val textLayout = dateLabelLayouts[key]

withTranslation(
x = bounds.centerX(),
y = viewState.headerPadding,
) {
draw(textLayout)
}
}

private fun Canvas.drawDateLabelInMultiDayView() {
drawInBounds(viewState.headerBounds) {
canvas.drawInBounds(viewState.headerBounds) {
viewState.dateRangeWithStartPixels.forEach { (date, startPixel) ->
drawLabel(date, startPixel)
}
}
}

private fun Canvas.drawLabel(date: Calendar, startPixel: Float) {
val key = date.toEpochDays()
private fun Canvas.drawLabel(day: Calendar, startPixel: Float) {
val key = day.toEpochDays()
val textLayout = dateLabelLayouts[key]

withTranslation(
x = startPixel + viewState.dayWidth / 2f,
y = viewState.headerPadding,
y = viewState.headerPadding
) {
draw(textLayout)
}
Expand Down Expand Up @@ -341,7 +324,8 @@ internal class AllDayEventsDrawer(

private class HeaderDrawer(
context: Context,
private val viewState: ViewState
private val viewState: ViewState,
private val beginWeekCalendar: Calendar?
) : Drawer {

private val upArrow: Drawable by lazy {
Expand All @@ -363,12 +347,8 @@ private class HeaderDrawer(

canvas.drawRect(0f, 0f, width, viewState.headerHeight, backgroundPaint)

if (viewState.showWeekNumber && viewState.numberOfVisibleDays > 1) {
canvas.drawWeekNumber()
}

if (viewState.showTimeColumnSeparator) {
canvas.drawTimeColumnSeparatorExtension()
if (viewState.showWeekNumber) {
canvas.drawWeekNumber(beginWeekCalendar = this.beginWeekCalendar)
}

if (viewState.showAllDayEventsToggleArrow) {
Expand All @@ -381,8 +361,40 @@ private class HeaderDrawer(
}
}

private fun Canvas.drawWeekNumber() {
val weekNumber = viewState.dateRange.first().weekOfYear.toString()
private fun Canvas.drawWeekNumber(beginWeekCalendar : Calendar ? = null) {

var weekNumber = viewState.dateRange.first().weekOfYear.toString()
// 自己适配周数
beginWeekCalendar?.apply {
var now = viewState.dateRange.first().copy()
now.apply {
set(Calendar.HOUR_OF_DAY, 0)
set(Calendar.MINUTE, 0)
set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0)
}

var begin2 = Calendar.getInstance()
begin2.apply {
set(Calendar.YEAR, now.get(Calendar.YEAR))
set(Calendar.DAY_OF_MONTH, beginWeekCalendar.get(Calendar.DAY_OF_MONTH))
set(Calendar.MONTH, beginWeekCalendar.get(Calendar.MONTH))
set(Calendar.HOUR_OF_DAY, 0)
set(Calendar.MINUTE, 0)
set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0)
add(Calendar.DAY_OF_YEAR, (get(Calendar.DAY_OF_WEEK) - Calendar.SUNDAY) * -1)
}
if (begin2.compareTo(now) > 0) {
begin2.apply {
set(Calendar.YEAR, get(Calendar.YEAR) - 1)
}
}

val between_days: Long = (now.timeInMillis - begin2.timeInMillis) / (1000 * 3600 * 24)
var i: Int = (between_days / 7).toInt() + 1
weekNumber = i.toString()
}

val bounds = viewState.weekNumberBounds
val textPaint = viewState.weekNumberTextPaint
Expand All @@ -409,18 +421,6 @@ private class HeaderDrawer(
drawText(weekNumber, bounds.centerX(), bounds.centerY() + textOffset, textPaint)
}

private fun Canvas.drawTimeColumnSeparatorExtension() {
val startX = if (viewState.isLtr) {
viewState.timeColumnWidth - viewState.timeColumnSeparatorPaint.strokeWidth / 2
} else {
viewState.viewWidth - viewState.timeColumnWidth
}

val startY = viewState.headerPadding
val stopY = viewState.headerHeight

drawLine(startX, startY, startX, stopY, viewState.timeColumnSeparatorPaint)
}

private fun Canvas.drawAllDayEventsToggleArrow() = with(viewState) {
val bottom = (headerHeight - headerPadding).roundToInt()
Expand Down
Loading