diff --git a/core/designsystem/src/commonMain/kotlin/io/github/droidkaigi/confsched/designsystem/theme/RoomTheme.kt b/core/designsystem/src/commonMain/kotlin/io/github/droidkaigi/confsched/designsystem/theme/RoomTheme.kt index 465fb8faa..b0d25aa39 100644 --- a/core/designsystem/src/commonMain/kotlin/io/github/droidkaigi/confsched/designsystem/theme/RoomTheme.kt +++ b/core/designsystem/src/commonMain/kotlin/io/github/droidkaigi/confsched/designsystem/theme/RoomTheme.kt @@ -37,6 +37,12 @@ sealed interface RoomTheme { override val dimColor = Color(0xFF121E25) } + data object Lunch : RoomTheme { + override val primaryColor = Color(0xFFC1C8C9) + override val containerColor = Color(0xFFC1C8C9).copy(alpha = 0.1f) + override val dimColor = Color(0xFF121E25) + } + val primaryColor: Color val containerColor: Color val dimColor: Color @@ -49,6 +55,7 @@ sealed interface RoomTheme { "giraffe" -> Giraffe "flamingo" -> Flamingo "jellyfish" -> Jellyfish + "lunch" -> Lunch else -> null } } diff --git a/core/model/src/commonMain/kotlin/io/github/droidkaigi/confsched/model/Timetable.kt b/core/model/src/commonMain/kotlin/io/github/droidkaigi/confsched/model/Timetable.kt index 89f155aa2..db541f273 100644 --- a/core/model/src/commonMain/kotlin/io/github/droidkaigi/confsched/model/Timetable.kt +++ b/core/model/src/commonMain/kotlin/io/github/droidkaigi/confsched/model/Timetable.kt @@ -169,6 +169,7 @@ public fun Timetable.Companion.fake(): Timetable { val start = DroidKaigi2024Day.Workday.start + (index * 60 * 60 + dayOffsetSeconds).seconds val end = DroidKaigi2024Day.Workday.start + (index * 60 * 60 + dayOffsetSeconds + 40 * 60).seconds val fake = Session.fake() + add( fake .copy( @@ -184,6 +185,32 @@ public fun Timetable.Companion.fake(): Timetable { ) } } + add( + TimetableItem.Special( + id = TimetableItemId("7"), + title = MultiLangText("Lunch break", "Lunch break"), + startsAt = DroidKaigi2024Day.ConferenceDay1.start + 13.hours, + endsAt = DroidKaigi2024Day.ConferenceDay1.start + 13.hours + 60.minutes, + category = TimetableCategory( + id = 28657, + title = MultiLangText("その他", "Other"), + ), + sessionType = TimetableSessionType.NORMAL, + room = roomsIterator.next(), + targetAudience = "", + language = TimetableLanguage( + langOfSpeaker = "", + isInterpretationTarget = false, + ), + asset = TimetableAsset(null, null), + levels = persistentListOf(), + speakers = persistentListOf(), + description = MultiLangText( + jaTitle = "Lunch break", + enTitle = "Lunch break", + ), + ), + ) add( TimetableItem.Special( id = TimetableItemId("3"), diff --git a/core/model/src/commonMain/kotlin/io/github/droidkaigi/confsched/model/TimetableItem.kt b/core/model/src/commonMain/kotlin/io/github/droidkaigi/confsched/model/TimetableItem.kt index 0a53519de..f376113d0 100644 --- a/core/model/src/commonMain/kotlin/io/github/droidkaigi/confsched/model/TimetableItem.kt +++ b/core/model/src/commonMain/kotlin/io/github/droidkaigi/confsched/model/TimetableItem.kt @@ -99,6 +99,8 @@ public sealed class TimetableItem { "https://2024.droidkaigi.jp/en/timetable/${id.value}" } + public val isLunch: Boolean get() = startsTimeString.startsWith("13:00") && title.enTitle.lowercase().contains("lunch") + fun getSupportedLangString(isJapaneseLocale: Boolean): String { val japanese = if (isJapaneseLocale) "日本語" else "Japanese" val english = if (isJapaneseLocale) "英語" else "English" diff --git a/core/model/src/commonMain/kotlin/io/github/droidkaigi/confsched/model/TimetableRoom.kt b/core/model/src/commonMain/kotlin/io/github/droidkaigi/confsched/model/TimetableRoom.kt index 23c2948d7..924850bd0 100644 --- a/core/model/src/commonMain/kotlin/io/github/droidkaigi/confsched/model/TimetableRoom.kt +++ b/core/model/src/commonMain/kotlin/io/github/droidkaigi/confsched/model/TimetableRoom.kt @@ -16,7 +16,7 @@ data class TimetableRoom( return sort.compareTo(other.sort) } - fun getThemeKey(): String = name.enTitle.lowercase() + fun getThemeKey(isLunch: Boolean? = false): String = if (isLunch == true) "lunch" else name.enTitle.lowercase() // TODO: Names are updated but the shapes need to be checked fun getShape(): Shapes { diff --git a/feature/sessions/src/commonMain/kotlin/io/github/droidkaigi/confsched/sessions/component/TimetableGridItem.kt b/feature/sessions/src/commonMain/kotlin/io/github/droidkaigi/confsched/sessions/component/TimetableGridItem.kt index 427b597f8..18c3e1880 100644 --- a/feature/sessions/src/commonMain/kotlin/io/github/droidkaigi/confsched/sessions/component/TimetableGridItem.kt +++ b/feature/sessions/src/commonMain/kotlin/io/github/droidkaigi/confsched/sessions/component/TimetableGridItem.kt @@ -106,7 +106,7 @@ fun TimetableGridItem( derivedStateOf { (height - TimetableGridItemSizes.padding * 2) / 4 > titleMinHeightDp * 3 / 2 } } - ProvideRoomTheme(timetableItem.room.getThemeKey()) { + ProvideRoomTheme(timetableItem.room.getThemeKey(timetableItem.isLunch)) { val titleTextStyle = MaterialTheme.typography.labelLarge.let { check(it.fontSize.isSp) val (titleFontSize, titleLineHeight) = calculateFontSizeAndLineHeight( @@ -161,13 +161,15 @@ fun TimetableGridItem( modifier = Modifier .weight(1f, fill = false), ) { - Icon( - modifier = Modifier.height(TimetableGridItemSizes.scheduleHeight), - imageVector = vectorResource(checkNotNull(timetableItem.room.icon)), - contentDescription = timetableItem.room.name.currentLangTitle, - tint = LocalRoomTheme.current.primaryColor, - ) - Spacer(modifier = Modifier.width(4.dp)) + if (!timetableItem.isLunch) { + Icon( + modifier = Modifier.height(TimetableGridItemSizes.scheduleHeight), + imageVector = vectorResource(checkNotNull(timetableItem.room.icon)), + contentDescription = timetableItem.room.name.currentLangTitle, + tint = LocalRoomTheme.current.primaryColor, + ) + Spacer(modifier = Modifier.width(4.dp)) + } var scheduleTextStyle = MaterialTheme.typography.labelSmall if (titleTextStyle.fontSize < scheduleTextStyle.fontSize) { scheduleTextStyle = diff --git a/feature/sessions/src/commonMain/kotlin/io/github/droidkaigi/confsched/sessions/section/TimetableGrid.kt b/feature/sessions/src/commonMain/kotlin/io/github/droidkaigi/confsched/sessions/section/TimetableGrid.kt index 12c077111..22e562d25 100644 --- a/feature/sessions/src/commonMain/kotlin/io/github/droidkaigi/confsched/sessions/section/TimetableGrid.kt +++ b/feature/sessions/src/commonMain/kotlin/io/github/droidkaigi/confsched/sessions/section/TimetableGrid.kt @@ -520,12 +520,25 @@ private data class TimetableItemLayout( private val displayEndsAt = timetableItem.endsAt.minus(1, DateTimeUnit.MINUTE) val height = ((displayEndsAt - timetableItem.startsAt).inWholeMinutes * minutePx).roundToInt() - val width = with(density) { TimetableSizes.columnWidth.roundToPx() } - val left = rooms.indexOf(timetableItem.room) * width val top = ((timetableItem.startsAt - dayStart).inWholeMinutes * minutePx).toInt() - val right = left + width val bottom = top + height + val width: Int + val left: Int + val right: Int + + init { + if (timetableItem.isLunch) { + width = with(density) { TimetableSizes.columnWidth.roundToPx() * 5 } + left = 0 // rooms.indexOf(RoomType.RoomF) * width //.indexOf(timetableItem.room) * width + right = left + width + } else { + width = with(density) { TimetableSizes.columnWidth.roundToPx() } + left = rooms.indexOf(timetableItem.room) * width + right = left + width + } + } + fun isVisible( screenWidth: Int, screenHeight: Int, @@ -537,7 +550,9 @@ private data class TimetableItemLayout( val screenTop = -scrollY val screenBottom = -scrollY + screenHeight val xInside = - left in screenLeft..screenRight || right in screenLeft..screenRight + left in screenLeft..screenRight || right in screenLeft..screenRight || + left <= screenLeft && right >= screenRight + val yInside = top in screenTop..screenBottom || bottom in screenTop..screenBottom || (top <= screenTop && screenBottom <= bottom)