feat(widget): tap anywhere on a month-widget day to open it (#18)
Previously only the small day-number was a tap target, so tapping the blank area of a day cell (or its "+N" overflow) did nothing. Make every non-event part of a day column open that day — the day number, the empty lane cells, and the overflow row — via a shared openDayAction, so a tap anywhere on a day opens it, matching the in-app month grid. Event bars keep opting out to open their own detail. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -304,6 +304,15 @@ private fun WeekRow(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open [date]'s day view rooted in the month view (so back returns to the month
|
||||||
|
* grid) — the same target the in-app month grid uses when a day cell is tapped.
|
||||||
|
* Shared by every tappable part of a day column so, as in the app, a tap anywhere
|
||||||
|
* on a day opens it; only an event bar on top opts out to open its own detail.
|
||||||
|
*/
|
||||||
|
private fun openDayAction(context: Context, date: LocalDate) =
|
||||||
|
actionStartActivity(MainActivity.openDateIntent(context, date, CalendarView.Month))
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun DayNumber(date: LocalDate, isToday: Boolean, inMonth: Boolean, colW: Dp) {
|
private fun DayNumber(date: LocalDate, isToday: Boolean, inMonth: Boolean, colW: Dp) {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
@@ -311,11 +320,7 @@ private fun DayNumber(date: LocalDate, isToday: Boolean, inMonth: Boolean, colW:
|
|||||||
modifier = GlanceModifier
|
modifier = GlanceModifier
|
||||||
.width(colW)
|
.width(colW)
|
||||||
.height(DAY_NUMBER_HEIGHT)
|
.height(DAY_NUMBER_HEIGHT)
|
||||||
// Tap a day number to open that day, rooted in the month view so back
|
.clickable(openDayAction(context, date)),
|
||||||
// returns to the month grid.
|
|
||||||
.clickable(
|
|
||||||
actionStartActivity(MainActivity.openDateIntent(context, date, CalendarView.Month)),
|
|
||||||
),
|
|
||||||
contentAlignment = Alignment.Center,
|
contentAlignment = Alignment.Center,
|
||||||
) {
|
) {
|
||||||
Box(
|
Box(
|
||||||
@@ -342,6 +347,7 @@ private fun DayNumber(date: LocalDate, isToday: Boolean, inMonth: Boolean, colW:
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun LaneRow(week: MonthWeek, lane: Int, dark: Boolean, colW: Dp) {
|
private fun LaneRow(week: MonthWeek, lane: Int, dark: Boolean, colW: Dp) {
|
||||||
|
val context = LocalContext.current
|
||||||
Row(modifier = GlanceModifier.fillMaxWidth()) {
|
Row(modifier = GlanceModifier.fillMaxWidth()) {
|
||||||
var col = 0
|
var col = 0
|
||||||
while (col < 7) {
|
while (col < 7) {
|
||||||
@@ -355,7 +361,14 @@ private fun LaneRow(week: MonthWeek, lane: Int, dark: Boolean, colW: Dp) {
|
|||||||
if (timed != null) {
|
if (timed != null) {
|
||||||
SpanBar(event = timed, dark = dark, width = colW)
|
SpanBar(event = timed, dark = dark, width = colW)
|
||||||
} else {
|
} else {
|
||||||
Box(GlanceModifier.width(colW).height(LANE_HEIGHT)) {}
|
// Empty lane cell: a tap opens that day, so blank space in a
|
||||||
|
// day column is a day-open target just like the number is.
|
||||||
|
Box(
|
||||||
|
GlanceModifier
|
||||||
|
.width(colW)
|
||||||
|
.height(LANE_HEIGHT)
|
||||||
|
.clickable(openDayAction(context, week.days[col])),
|
||||||
|
) {}
|
||||||
}
|
}
|
||||||
col += 1
|
col += 1
|
||||||
}
|
}
|
||||||
@@ -404,14 +417,20 @@ private fun SpanBar(event: EventInstance, dark: Boolean, width: Dp) {
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun OverflowRow(week: MonthWeek, colW: Dp) {
|
private fun OverflowRow(week: MonthWeek, colW: Dp) {
|
||||||
|
val context = LocalContext.current
|
||||||
Row(modifier = GlanceModifier.fillMaxWidth()) {
|
Row(modifier = GlanceModifier.fillMaxWidth()) {
|
||||||
week.days.forEachIndexed { col, date ->
|
week.days.forEachIndexed { col, date ->
|
||||||
val shownSpans = week.spans.count { col in it.startCol..it.endCol && it.lane < MAX_LANES }
|
val shownSpans = week.spans.count { col in it.startCol..it.endCol && it.lane < MAX_LANES }
|
||||||
val freeSlots = (MAX_LANES - shownSpans).coerceAtLeast(0)
|
val freeSlots = (MAX_LANES - shownSpans).coerceAtLeast(0)
|
||||||
val timedShown = minOf(freeSlots, week.timedByDay[date].orEmpty().size)
|
val timedShown = minOf(freeSlots, week.timedByDay[date].orEmpty().size)
|
||||||
val hidden = (week.countByDay[date] ?: 0) - shownSpans - timedShown
|
val hidden = (week.countByDay[date] ?: 0) - shownSpans - timedShown
|
||||||
|
// The overflow row is part of the day column too: tapping it (whether
|
||||||
|
// it shows "+N" or is blank) opens that day, same as the app.
|
||||||
Box(
|
Box(
|
||||||
modifier = GlanceModifier.width(colW).height(LANE_HEIGHT),
|
modifier = GlanceModifier
|
||||||
|
.width(colW)
|
||||||
|
.height(LANE_HEIGHT)
|
||||||
|
.clickable(openDayAction(context, date)),
|
||||||
contentAlignment = Alignment.CenterStart,
|
contentAlignment = Alignment.CenterStart,
|
||||||
) {
|
) {
|
||||||
if (hidden > 0) {
|
if (hidden > 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user