nordiccalendar

A simple Material 3 native calendar app fitting my personal requirements
git clone git://archive.git.mtrnord.blog/MTRNord/nordiccalendar.git
Log | Files | Refs | README | LICENSE

commit 1ed51dcac6b1607aecdaf0ebf5c8c43f9f015fc8
parent 89e94050c7136a09de5d6ad2e92d1fb2bd08b5d2
Author: MTRNord <MTRNord@users.noreply.github.com>
Date:   Wed, 30 Jul 2025 00:15:29 +0200

Move assignColums out

Diffstat:
Mapp/src/main/java/space/midnightthoughts/nordiccalendar/screens/CalendarScreen.kt | 53+++++++++++++++++++++++++++--------------------------
1 file changed, 27 insertions(+), 26 deletions(-)

diff --git a/app/src/main/java/space/midnightthoughts/nordiccalendar/screens/CalendarScreen.kt b/app/src/main/java/space/midnightthoughts/nordiccalendar/screens/CalendarScreen.kt @@ -167,6 +167,26 @@ fun CalendarScreen( } } +fun assignColumns(events: List<Event>): List<Triple<Event, Int, Int>> { + val sorted = events.sortedBy { it.startTime } + val active = mutableListOf<Pair<Event, Int>>() // Event, column + val result = + mutableListOf<Triple<Event, Int, Int>>() // Event, column, maxColumns + for (event in sorted) { + // Entferne abgelaufene Events + active.removeAll { it.first.endTime <= event.startTime } + // Finde freie Spalte + val usedColumns = active.map { it.second }.toSet() + val col = + (0..active.size).firstOrNull { it !in usedColumns } ?: active.size + active.add(event to col) + // maxColumns = aktuelle Anzahl aktiver Events + val maxColumns = active.size + result.add(Triple(event, col, maxColumns)) + } + return result +} + @SuppressLint("UnusedBoxWithConstraintsScope") @Composable fun DayView( @@ -175,7 +195,7 @@ fun DayView( ) { val events = remember(calendarViewModel) { calendarViewModel.events - }.collectAsState(initial = emptyList()) + }.collectAsState() val hourHeightDp = 64.dp val timeColumnWidth = 64.dp @@ -206,6 +226,12 @@ fun DayView( modifier = Modifier .fillMaxSize() .verticalScroll(scrollState) + .semantics { + collectionInfo = CollectionInfo( + rowCount = events.value.size, + columnCount = 1, + ) + } ) { val maxWidthPx = with(density) { maxWidth.toPx() } val lineThickness = 4.dp @@ -214,12 +240,6 @@ fun DayView( Column( modifier = Modifier .fillMaxWidth() - .semantics { - collectionInfo = CollectionInfo( - rowCount = events.value.size, - columnCount = 1, - ) - } ) { for (hour in 0..24) { // Bis einschließlich 24, um 00:00 am Folgetag anzuzeigen Row( @@ -238,25 +258,6 @@ fun DayView( } } } - fun assignColumns(events: List<Event>): List<Triple<Event, Int, Int>> { - val sorted = events.sortedBy { it.startTime } - val active = mutableListOf<Pair<Event, Int>>() // Event, column - val result = - mutableListOf<Triple<Event, Int, Int>>() // Event, column, maxColumns - for (event in sorted) { - // Entferne abgelaufene Events - active.removeAll { it.first.endTime <= event.startTime } - // Finde freie Spalte - val usedColumns = active.map { it.second }.toSet() - val col = - (0..active.size).firstOrNull { it !in usedColumns } ?: active.size - active.add(event to col) - // maxColumns = aktuelle Anzahl aktiver Events - val maxColumns = active.size - result.add(Triple(event, col, maxColumns)) - } - return result - } val eventColumns = assignColumns(events.value) eventColumns.forEach { (event, col, maxColumns) ->