Skip to content

Commit 11f849e

Browse files
committed
Improve how borders are drawn for multi-day events
1 parent 965e88d commit 11f849e

File tree

5 files changed

+59
-17
lines changed

5 files changed

+59
-17
lines changed

core/src/main/java/com/alamkanak/weekview/CanvasExtensions.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.alamkanak.weekview
22

33
import android.graphics.Canvas
4+
import android.graphics.Paint
45
import android.graphics.RectF
56

67
fun Canvas.withTranslation(x: Float, y: Float, block: Canvas.() -> Unit) {
@@ -10,6 +11,15 @@ fun Canvas.withTranslation(x: Float, y: Float, block: Canvas.() -> Unit) {
1011
restore()
1112
}
1213

14+
fun Canvas.drawVerticalLine(
15+
horizontalOffset: Float,
16+
startY: Float,
17+
endY: Float,
18+
paint: Paint
19+
) {
20+
drawLine(horizontalOffset, startY, horizontalOffset, endY, paint)
21+
}
22+
1323
fun Canvas.drawInBounds(
1424
left: Float,
1525
top: Float,

core/src/main/java/com/alamkanak/weekview/EventChipDrawer.kt

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ internal class EventChipDrawer(
3333

3434
if (event.style.borderWidth != null) {
3535
updateBorderPaint(event, borderPaint)
36-
3736
val borderBounds = bounds.insetBy(event.style.borderWidth / 2f)
3837
canvas.drawRoundRect(borderBounds, cornerRadius, cornerRadius, borderPaint)
3938
}
@@ -72,40 +71,72 @@ internal class EventChipDrawer(
7271
}
7372

7473
if (event.style.borderWidth != null) {
75-
drawBorderStroke(eventChip, canvas)
74+
drawMultiDayBorderStroke(eventChip, cornerRadius, canvas)
7675
}
7776
}
7877

79-
private fun drawBorderStroke(
78+
private fun drawMultiDayBorderStroke(
8079
eventChip: EventChip,
80+
cornerRadius: Float,
8181
canvas: Canvas
8282
) {
8383
val event = eventChip.event
8484
val originalEvent = eventChip.originalEvent
8585
val rect = checkNotNull(eventChip.bounds)
8686

8787
val borderWidth = event.style.borderWidth ?: 0
88-
val innerWidth = rect.width() - borderWidth * 2
88+
val borderStart = rect.left + borderWidth / 2
89+
val borderEnd = rect.right - borderWidth / 2
90+
91+
// val innerWidth = rect.width() - borderWidth * 2
8992

90-
val borderStartX = rect.left + borderWidth
91-
val borderEndX = borderStartX + innerWidth
93+
// val borderStartX = rect.left + borderWidth
94+
// val borderEndX = borderStartX + innerWidth
9295

9396
updateBorderPaint(event, backgroundPaint)
9497

9598
if (event.startsOnEarlierDay(originalEvent)) {
9699
// Remove top rounded corners by drawing a rectangle
97-
val borderStartY = rect.top
98-
val borderEndY = borderStartY + borderWidth
99-
val newRect = RectF(borderStartX, borderStartY, borderEndX, borderEndY)
100-
canvas.drawRect(newRect, backgroundPaint)
100+
// val borderStartY = rect.top
101+
// val borderEndY = borderStartY + borderWidth
102+
// val newRect = RectF(borderStartX, borderStartY, borderEndX, borderEndY)
103+
// canvas.drawRect(newRect, backgroundPaint)
104+
105+
canvas.drawVerticalLine(
106+
horizontalOffset = borderStart,
107+
startY = rect.top,
108+
endY = rect.top + cornerRadius,
109+
paint = backgroundPaint
110+
)
111+
112+
canvas.drawVerticalLine(
113+
horizontalOffset = borderEnd,
114+
startY = rect.top,
115+
endY = rect.top + cornerRadius,
116+
paint = backgroundPaint
117+
)
101118
}
102119

103120
if (event.endsOnLaterDay(originalEvent)) {
104121
// Remove bottom rounded corners by drawing a rectangle
105-
val borderEndY = rect.bottom
106-
val borderStartY = borderEndY - borderWidth
107-
val newRect = RectF(borderStartX, borderStartY, borderEndX, borderEndY)
108-
canvas.drawRect(newRect, backgroundPaint)
122+
// val borderEndY = rect.bottom
123+
// val borderStartY = borderEndY - borderWidth
124+
// val newRect = RectF(borderStartX, borderStartY, borderEndX, borderEndY)
125+
// canvas.drawRect(newRect, backgroundPaint)
126+
127+
canvas.drawVerticalLine(
128+
horizontalOffset = borderStart,
129+
startY = rect.bottom - cornerRadius,
130+
endY = rect.bottom,
131+
paint = backgroundPaint
132+
)
133+
134+
canvas.drawVerticalLine(
135+
horizontalOffset = borderEnd,
136+
startY = rect.bottom - cornerRadius,
137+
endY = rect.bottom,
138+
paint = backgroundPaint
139+
)
109140
}
110141
}
111142

core/src/main/java/com/alamkanak/weekview/WeekView.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1418,6 +1418,7 @@ class WeekView @JvmOverloads constructor(
14181418
*
14191419
* @param events The [WeekViewDisplayable] elements that are to be displayed in [WeekView]
14201420
*/
1421+
@PublicApi
14211422
fun submit(events: List<WeekViewDisplayable<T>>) {
14221423
val viewState = weekView?.viewState ?: return
14231424
eventsDiffer.submit(events, viewState, onFinished = this::updateObserver)
@@ -1449,6 +1450,7 @@ class WeekView @JvmOverloads constructor(
14491450
*
14501451
* @param events The [WeekViewDisplayable] elements that are to be displayed in [WeekView]
14511452
*/
1453+
@PublicApi
14521454
fun submit(events: List<WeekViewDisplayable<T>>) {
14531455
val viewState = weekView?.viewState ?: return
14541456
eventsDiffer.submit(events, viewState, onFinished = this::updateObserver)
@@ -1465,12 +1467,14 @@ class WeekView @JvmOverloads constructor(
14651467
* @param startDate A [Calendar] of the first date of the month that needs to be fetched
14661468
* @param endDate A [Calendar] of the last date of the month that needs to be fetched
14671469
*/
1470+
@PublicApi
14681471
open fun onLoadMore(startDate: Calendar, endDate: Calendar) = Unit
14691472

14701473
/**
14711474
* Refreshes the [WeekViewDisplayable] elements presented by this adapter. All cached
14721475
* elements will be removed and a call to [onLoadMore] will be triggered.
14731476
*/
1477+
@PublicApi
14741478
fun refresh() {
14751479
eventsCache.clear()
14761480
weekView?.invalidate()

sample/src/main/java/com/alamkanak/weekview/sample/BasicActivity.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ class BasicActivity : AppCompatActivity() {
4848

4949
toolbar.setupWithWeekView(weekView)
5050

51-
WeekView.SimpleAdapter<Int>()
52-
5351
val adapter = BasicActivityWeekViewAdapter(loadMoreHandler = viewModel::fetchEvents)
5452
weekView.adapter = adapter
5553

sample/src/main/java/com/alamkanak/weekview/sample/data/EventsDatabase.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ class EventsDatabase(context: Context) {
6262
hour = 20,
6363
minute = 0,
6464
duration = 5 * 60,
65-
isCanceled = true,
6665
color = color4
6766
)
6867

0 commit comments

Comments
 (0)