### Part A — the title shortens instead of wrapping `CalendarTitleButton` measures the full title against the width the bar hands the title slot (`BoxWithConstraints` + `rememberTextMeasurer`) and falls back to a shorter form when it does not fit. One pass, so no flicker, and it adapts on its own to locale, font scale and to the pill being absent after #150. - Month and week fall back to the three-letter month ("Sep", "Mär"). - Day drops the weekday instead ("Wed, 2 Sep 2027" → "2 Sep 2027") — there is no shorter month form left there, `EEEdMMM` is already abbreviated. - Either way the title now clamps to one line and ellipsises rather than growing the bar to two lines. The choice itself is a pure `titleFor(title, shortTitle, titleWidth, availableWidth)`, so it is unit-tested rather than only reachable through a composable. `formatCalendarTitle` gained no new behaviour, so the widget header is untouched. ### Part B — the trailing edge, not the whole rhythm `AppBarSpacing` holds the shared values: the side inset (also consumed by the month grid, so the pill lines up with the content under it), the title's start inset, and the two trailing insets — one measured to a container's background, one to an icon button's glyph. **Deviation from the issue:** the issue asks for one edge inset at *both* ends and one gap between adjacent controls. Only the trailing edge and the title inset are shared here. M3 derives both the title's position and the gap between two adjacent action icons from the icon buttons' width, so putting the leading edge and the inter-icon gaps on the same rhythm meant narrowing the icon buttons from 48.dp to 32.dp — that reads cramped and shrinks the touch targets. The leading edge and the icon gaps stay on M3's defaults. The title's 8.dp start inset stays real padding rather than a negative offset, so the menu button's hit box is intact. The agenda range bar picks its end inset from whether the view switcher is showing: aligned to the pill's background when it is, to the search icon's glyph once #150 hides it. Closes #165 Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de> Reviewed-on: https://codeberg.org/jlmakiola/calendula/pulls/261
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
package de.jeanlucmakiola.calendula.ui.common
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
class AppBarSpacingTest {
|
||||
|
||||
@Test
|
||||
fun `the pill's background ends one inset from the screen edge`() {
|
||||
// The padding is applied inside M3's actions row, so it carries that
|
||||
// row's own inset on top of whatever the pill asks for (#165).
|
||||
val rendered = AppBarSpacing.BarPadding + AppBarSpacing.ContainerTrailingInset
|
||||
assertThat(rendered).isEqualTo(AppBarSpacing.Inset)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `trailing insets stay non-negative`() {
|
||||
// Modifier.padding throws on a negative value.
|
||||
assertThat(AppBarSpacing.ContainerTrailingInset.value).isAtLeast(0f)
|
||||
assertThat(AppBarSpacing.IconTrailingInset.value).isAtLeast(0f)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `an icon button's glyph ends further in than a container's edge`() {
|
||||
assertThat(AppBarSpacing.IconTrailingInset.value)
|
||||
.isGreaterThan(AppBarSpacing.Inset.value)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package de.jeanlucmakiola.calendula.ui.common
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
class CalendarTitleButtonTest {
|
||||
|
||||
@Test
|
||||
fun `keeps the full title when it fits`() {
|
||||
assertThat(titleFor("September", "Sep", titleWidth = 200, availableWidth = 300))
|
||||
.isEqualTo("September")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `keeps the full title when it fills the slot exactly`() {
|
||||
assertThat(titleFor("September", "Sep", titleWidth = 300, availableWidth = 300))
|
||||
.isEqualTo("September")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `falls back to the short title when the full one overflows`() {
|
||||
assertThat(titleFor("September", "Sep", titleWidth = 400, availableWidth = 300))
|
||||
.isEqualTo("Sep")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `a caller with nothing to shorten still gets its own title back`() {
|
||||
assertThat(titleFor("Wed, 2 Sep", "Wed, 2 Sep", titleWidth = 400, availableWidth = 300))
|
||||
.isEqualTo("Wed, 2 Sep")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user