Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c82d6edcf0 |
@@ -123,6 +123,7 @@ import androidx.compose.ui.platform.LocalDensity
|
|||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.semantics.contentDescription
|
import androidx.compose.ui.semantics.contentDescription
|
||||||
import androidx.compose.ui.semantics.semantics
|
import androidx.compose.ui.semantics.semantics
|
||||||
|
import androidx.compose.ui.text.rememberTextMeasurer
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.text.style.TextOverflow
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
@@ -744,7 +745,7 @@ internal fun WeekdayHeader(weekStart: DayOfWeek, showWeekNumbers: Boolean) {
|
|||||||
.padding(horizontal = AppBarSpacing.Inset, vertical = 4.dp),
|
.padding(horizontal = AppBarSpacing.Inset, vertical = 4.dp),
|
||||||
) {
|
) {
|
||||||
// Reserve the gutter so the weekday labels stay over their day columns.
|
// Reserve the gutter so the weekday labels stay over their day columns.
|
||||||
if (showWeekNumbers) Spacer(Modifier.width(WEEK_NUMBER_GUTTER))
|
if (showWeekNumbers) Spacer(Modifier.width(rememberWeekNumberGutter()))
|
||||||
days.forEach { dow ->
|
days.forEach { dow ->
|
||||||
val isWeekend = dow == DayOfWeek.SATURDAY || dow == DayOfWeek.SUNDAY
|
val isWeekend = dow == DayOfWeek.SATURDAY || dow == DayOfWeek.SUNDAY
|
||||||
val javaDow = java.time.DayOfWeek.of(dow.ordinal + 1)
|
val javaDow = java.time.DayOfWeek.of(dow.ordinal + 1)
|
||||||
@@ -762,9 +763,34 @@ internal fun WeekdayHeader(weekStart: DayOfWeek, showWeekNumbers: Boolean) {
|
|||||||
|
|
||||||
private val EVENT_ROW_HEIGHT = 20.dp
|
private val EVENT_ROW_HEIGHT = 20.dp
|
||||||
private val DAY_NUMBER_HEIGHT = 22.dp
|
private val DAY_NUMBER_HEIGHT = 22.dp
|
||||||
/** Width of the optional left calendar-week gutter (#25); narrow, since it only
|
/** Padding between the week-number pill's edge and the number inside it. */
|
||||||
* seats a one- or two-digit week number in a full-height tonal pill. */
|
private val WEEK_NUMBER_PADDING = 6.dp
|
||||||
private val WEEK_NUMBER_GUTTER = 40.dp
|
|
||||||
|
/** The widest week number an ISO year reaches; digits are tabular, so one
|
||||||
|
* measurement of it prices every week in the grid. */
|
||||||
|
private const val WEEK_NUMBER_SAMPLE = "53"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Width of the optional left calendar-week gutter (#25), measured rather than
|
||||||
|
* fixed: it is sized to the number it seats at the style the pill draws it in,
|
||||||
|
* so it follows the font scale instead of reserving slack for it, and spends
|
||||||
|
* nothing more on a column the grid would rather hand to the seven days (#213).
|
||||||
|
*/
|
||||||
|
@Composable
|
||||||
|
private fun rememberWeekNumberGutter(): Dp {
|
||||||
|
val measurer = rememberTextMeasurer()
|
||||||
|
val density = LocalDensity.current
|
||||||
|
val style = weekNumberStyle()
|
||||||
|
return remember(style, density, measurer) {
|
||||||
|
val text = with(density) { measurer.measure(WEEK_NUMBER_SAMPLE, style).size.width.toDp() }
|
||||||
|
text + (WEEK_NUMBER_PADDING + CELL_GAP) * 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The week number's own style — a step down from the day numbers beside it. */
|
||||||
|
@Composable
|
||||||
|
private fun weekNumberStyle() =
|
||||||
|
MaterialTheme.typography.labelMedium.copy(fontWeight = FontWeight.Bold)
|
||||||
private val DAY_NUMBER_GAP = 4.dp
|
private val DAY_NUMBER_GAP = 4.dp
|
||||||
private val CELL_TOP_PADDING = 6.dp
|
private val CELL_TOP_PADDING = 6.dp
|
||||||
/** Named separately because the split style's selection outline draws its own
|
/** Named separately because the split style's selection outline draws its own
|
||||||
@@ -1486,7 +1512,7 @@ internal fun SplitMonthGrid(
|
|||||||
WeekNumberGutter(
|
WeekNumberGutter(
|
||||||
weekStart = week.days.first(),
|
weekStart = week.days.first(),
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.width(WEEK_NUMBER_GUTTER)
|
.width(rememberWeekNumberGutter())
|
||||||
.fillMaxHeight(),
|
.fillMaxHeight(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -2007,7 +2033,7 @@ private fun MonthWeekRow(
|
|||||||
WeekNumberGutter(
|
WeekNumberGutter(
|
||||||
weekStart = week.days.first(),
|
weekStart = week.days.first(),
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.width(WEEK_NUMBER_GUTTER)
|
.width(rememberWeekNumberGutter())
|
||||||
.fillMaxHeight(),
|
.fillMaxHeight(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -2422,8 +2448,7 @@ private fun WeekNumberGutter(weekStart: LocalDate, modifier: Modifier = Modifier
|
|||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
text = weekNumber.toString(),
|
text = weekNumber.toString(),
|
||||||
style = MaterialTheme.typography.titleSmall,
|
style = weekNumberStyle(),
|
||||||
fontWeight = FontWeight.Bold,
|
|
||||||
color = MaterialTheme.colorScheme.onSecondaryContainer,
|
color = MaterialTheme.colorScheme.onSecondaryContainer,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -571,7 +571,7 @@ private fun WeekDayHeader(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Calendar-week badge shown in the header gutter, deliberately set apart with a
|
/** Calendar-week badge shown in the header gutter, deliberately set apart with a
|
||||||
* filled box and bold number. */
|
* filled box and bold number — at the month grid's size, so the two agree (#213). */
|
||||||
@Composable
|
@Composable
|
||||||
private fun WeekNumberBadge(weekNumber: Int, modifier: Modifier = Modifier) {
|
private fun WeekNumberBadge(weekNumber: Int, modifier: Modifier = Modifier) {
|
||||||
val label = stringResource(R.string.week_number_label)
|
val label = stringResource(R.string.week_number_label)
|
||||||
@@ -583,9 +583,9 @@ private fun WeekNumberBadge(weekNumber: Int, modifier: Modifier = Modifier) {
|
|||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
text = weekNumber.toString(),
|
text = weekNumber.toString(),
|
||||||
style = MaterialTheme.typography.titleSmall,
|
style = MaterialTheme.typography.labelMedium,
|
||||||
fontWeight = FontWeight.Bold,
|
fontWeight = FontWeight.Bold,
|
||||||
modifier = Modifier.padding(horizontal = 8.dp, vertical = 3.dp),
|
modifier = Modifier.padding(horizontal = 6.dp, vertical = 3.dp),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user