From c5083053b66f326f819a3d1a0e72ce24b41a72c8 Mon Sep 17 00:00:00 2001 From: jinukeu Date: Wed, 6 Dec 2023 16:54:19 +0900 Subject: [PATCH 01/18] =?UTF-8?q?chore:=20design-system=20core:model=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/designsystem/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/core/designsystem/build.gradle.kts b/core/designsystem/build.gradle.kts index ca4353549..e8ec2353f 100644 --- a/core/designsystem/build.gradle.kts +++ b/core/designsystem/build.gradle.kts @@ -9,5 +9,6 @@ android { } dependencies { + implementation(projects.core.model) implementation(projects.core.ui) } From 735dd4ac255b1a5afca6681e38474486ed43d07d Mon Sep 17 00:00:00 2001 From: jinukeu Date: Wed, 6 Dec 2023 17:08:41 +0900 Subject: [PATCH 02/18] =?UTF-8?q?chore:=20`@Stable`=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?startTime,=20endTime=20=ED=83=80=EC=9E=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/model/build.gradle.kts | 4 ++++ .../main/java/com/suwiki/core/model/timetable/Timetable.kt | 3 +++ .../java/com/suwiki/core/model/timetable/TimetableCell.kt | 7 +++++-- gradle/libs.versions.toml | 2 ++ .../converter/TimetableEntity.kt | 6 ------ 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts index 04b2e2f28..971a1cd60 100644 --- a/core/model/build.gradle.kts +++ b/core/model/build.gradle.kts @@ -3,3 +3,7 @@ plugins { alias(libs.plugins.suwiki.java.library) } + +dependencies { + compileOnly(libs.compose.stable.marker) +} diff --git a/core/model/src/main/java/com/suwiki/core/model/timetable/Timetable.kt b/core/model/src/main/java/com/suwiki/core/model/timetable/Timetable.kt index dc4b16446..43db15148 100644 --- a/core/model/src/main/java/com/suwiki/core/model/timetable/Timetable.kt +++ b/core/model/src/main/java/com/suwiki/core/model/timetable/Timetable.kt @@ -1,5 +1,8 @@ package com.suwiki.core.model.timetable +import androidx.compose.runtime.Stable + +@Stable data class Timetable( val createTime: Long, val year: String, diff --git a/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt b/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt index f036b0111..278c521ab 100644 --- a/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt +++ b/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt @@ -1,12 +1,15 @@ package com.suwiki.core.model.timetable +import androidx.compose.runtime.Stable + +@Stable data class TimetableCell( val name: String = "", val professor: String = "", val location: String = "", val day: String = "", - val startTime: String = "", - val endTime: String = "", + val startTime: Int? = null, + val endTime: Int? = null, val color: Int, val credit: String = "", ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cd2fb17a3..8893710bf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,6 +12,7 @@ compose-compiler = "1.5.3" compose-bom = "2023.10.00-alpha02" compose-material3 = "1.2.0-alpha07" activity-compose = "1.7.2" +compose-stable-marker = "1.0.3" androidx-hilt-navigation-compose = "1.0.0" androidx-app-compat = "1.6.1" @@ -111,6 +112,7 @@ activity-compose = { group = "androidx.activity", name = "activity-compose", ver lifecycle-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "androidx-lifecycle" } navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "androidx-navigation" } hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "androidx-hilt-navigation-compose" } +compose-stable-marker = { group = "com.github.skydoves", name = "compose-stable-marker", version.ref = "compose-stable-marker" } hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } hilt-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt" } diff --git a/local/timetable/src/main/java/com.suwiki.local.timetable/converter/TimetableEntity.kt b/local/timetable/src/main/java/com.suwiki.local.timetable/converter/TimetableEntity.kt index 8586e00dc..e4b730ba0 100644 --- a/local/timetable/src/main/java/com.suwiki.local.timetable/converter/TimetableEntity.kt +++ b/local/timetable/src/main/java/com.suwiki.local.timetable/converter/TimetableEntity.kt @@ -2,8 +2,6 @@ package com.suwiki.local.timetable.converter import com.suwiki.core.database.model.TimetableEntity import com.suwiki.core.model.timetable.Timetable -import com.suwiki.core.model.timetable.TimetableCell -import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json fun TimetableEntity.toModel() = Timetable( @@ -13,7 +11,3 @@ fun TimetableEntity.toModel() = Timetable( name = timetableName, cellList = Json.decodeFromString(timetableJsonData), ) - -fun arrayToJson(data: MutableList): String { - return Json.encodeToString(data) -} From 2c0775e52e5e71b49e0ba41f637959ce2704be84 Mon Sep 17 00:00:00 2001 From: jinukeu Date: Wed, 6 Dec 2023 21:27:25 +0900 Subject: [PATCH 03/18] =?UTF-8?q?design:=20TimetableCellColor=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/timetable/TimetableCellColor.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCellColor.kt diff --git a/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCellColor.kt b/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCellColor.kt new file mode 100644 index 000000000..f0fc1b50f --- /dev/null +++ b/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCellColor.kt @@ -0,0 +1,24 @@ +package com.suwiki.core.model.timetable + +enum class TimetableCellColor { + BROWN, + LIGHT_BROWN, + ORANGE, + APRICOT, // 살구 + PURPLE, + PURPLE_LIGHT, + RED_LIGHT, + PINK, + BROWN_DARK, + GREEN_DARK, + GREEN, + GREEN_LIGHT, + NAVY_DARK, + NAVY, + NAVY_LIGHT, + VIOLET, + GRAY_DARK, + GRAY, + SKY, + VIOLET_LIGHT, +} From 173cdac769b30f2382b7c72b0ef8ee9508540263 Mon Sep 17 00:00:00 2001 From: jinukeu Date: Wed, 6 Dec 2023 21:27:56 +0900 Subject: [PATCH 04/18] =?UTF-8?q?refactor:=20Timetable=20property=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/suwiki/core/model/timetable/TimetableCell.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt b/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt index 278c521ab..47ed6f574 100644 --- a/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt +++ b/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt @@ -8,9 +8,9 @@ data class TimetableCell( val professor: String = "", val location: String = "", val day: String = "", - val startTime: Int? = null, - val endTime: Int? = null, - val color: Int, + val startTime: Int = 0, + val endTime: Int = 0, + val color: TimetableCellColor, val credit: String = "", ) From da44d53fa9fe49b9fdc41844432b67ffdbff7770 Mon Sep 17 00:00:00 2001 From: jinukeu Date: Wed, 6 Dec 2023 21:28:19 +0900 Subject: [PATCH 05/18] =?UTF-8?q?design:=20TimetableCell=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/timetable/TimetableCell.kt | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCell.kt diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCell.kt new file mode 100644 index 000000000..ef49d1f9b --- /dev/null +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCell.kt @@ -0,0 +1,149 @@ +package com.suwiki.core.designsystem.component.timetable + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.suwiki.core.model.timetable.TimetableCell +import com.suwiki.core.model.timetable.TimetableCellColor +import com.suwiki.core.ui.extension.suwikiClickable + +enum class TimetableCellType { + CLASSNAME, + CLASSNAME_LOCATION, + CLASSNAME_PROFESSOR, + CLASSNAME_PROFESSOR_LOCATION, +} + +const val TIMETABLE_HEIGHT_PER_HOUR = 48 +const val TIMETABLE_HEIGHT_PER_10MINUTE = 8 + +internal fun timetableCellColorToHex(color: TimetableCellColor): Long { + return when (color) { + TimetableCellColor.BROWN -> 0xFFC28F62 + TimetableCellColor.LIGHT_BROWN -> 0xFFD4AC89 + TimetableCellColor.ORANGE -> 0xFFFFC152 + TimetableCellColor.APRICOT -> 0xFFFFC152 + TimetableCellColor.PURPLE -> 0xFF7E3348 + TimetableCellColor.PURPLE_LIGHT -> 0xFFC97189 + TimetableCellColor.RED_LIGHT -> 0xFFFE8888 + TimetableCellColor.PINK -> 0xFFFDA1E4 + TimetableCellColor.BROWN_DARK -> 0xFF614730 + TimetableCellColor.GREEN_DARK -> 0xFF96B277 + TimetableCellColor.GREEN -> 0xFFA5DC81 + TimetableCellColor.GREEN_LIGHT -> 0xFF99ECA5 + TimetableCellColor.NAVY_DARK -> 0xFF435796 + TimetableCellColor.NAVY -> 0xFF5772C1 + TimetableCellColor.NAVY_LIGHT -> 0xFF899DFE + TimetableCellColor.VIOLET -> 0xFFCC9AF3 + TimetableCellColor.GRAY_DARK -> 0xFF525252 + TimetableCellColor.GRAY -> 0xFFC2C1BD + TimetableCellColor.SKY -> 0xFF89C8FE + TimetableCellColor.VIOLET_LIGHT -> 0xFFC0C6E0 + } +} + +@Composable +fun TimetableCell( + modifier: Modifier = Modifier, + type: TimetableCellType = TimetableCellType.CLASSNAME_PROFESSOR_LOCATION, + data: TimetableCell, + onClick: (TimetableCell) -> Unit = { _ -> }, +) { + val (showProfessor, showLocation) = when (type) { + TimetableCellType.CLASSNAME -> (false to false) + TimetableCellType.CLASSNAME_LOCATION -> (false to true) + TimetableCellType.CLASSNAME_PROFESSOR -> (true to false) + TimetableCellType.CLASSNAME_PROFESSOR_LOCATION -> (true to true) + } + + val height = (data.endTime - data.startTime) * TIMETABLE_HEIGHT_PER_HOUR - TIMETABLE_HEIGHT_PER_10MINUTE + + Column( + modifier = modifier + .fillMaxWidth() + .height(height.dp) + .background(Color(timetableCellColorToHex(data.color))) + .suwikiClickable { + onClick(data) + }, + ) { + Text(text = data.name) + + if (showProfessor) Text(text = data.professor) + + if (showLocation) Text(text = data.location) + } +} + +@Preview +@Composable +fun TimetableCellPreview() { + Column( + verticalArrangement = Arrangement.spacedBy(20.dp), + ) { + TimetableCell( + modifier = Modifier.width(50.dp), + type = TimetableCellType.CLASSNAME, + data = TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + day = "", + startTime = 1, + endTime = 3, + color = TimetableCellColor.GREEN, + ), + ) + + TimetableCell( + modifier = Modifier.width(50.dp), + type = TimetableCellType.CLASSNAME_PROFESSOR, + data = TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + day = "", + startTime = 1, + endTime = 3, + color = TimetableCellColor.GREEN, + ), + ) + + TimetableCell( + modifier = Modifier.width(50.dp), + type = TimetableCellType.CLASSNAME_LOCATION, + data = TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + day = "", + startTime = 1, + endTime = 3, + color = TimetableCellColor.GREEN, + ), + ) + + TimetableCell( + modifier = Modifier.width(50.dp), + type = TimetableCellType.CLASSNAME_PROFESSOR_LOCATION, + data = TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + day = "", + startTime = 1, + endTime = 3, + color = TimetableCellColor.GREEN, + ), + ) + } +} From a2d0f8fbe6dd662be215be6889866007c64d760b Mon Sep 17 00:00:00 2001 From: jinukeu Date: Sat, 9 Dec 2023 18:30:59 +0900 Subject: [PATCH 06/18] =?UTF-8?q?design:=20TimetableCell=20=ED=85=8C?= =?UTF-8?q?=ED=88=AC=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/timetable/TimetableCell.kt | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCell.kt index ef49d1f9b..f6779f850 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCell.kt @@ -1,10 +1,14 @@ package com.suwiki.core.designsystem.component.timetable import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -12,6 +16,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.times import com.suwiki.core.model.timetable.TimetableCell import com.suwiki.core.model.timetable.TimetableCellColor import com.suwiki.core.ui.extension.suwikiClickable @@ -23,9 +28,6 @@ enum class TimetableCellType { CLASSNAME_PROFESSOR_LOCATION, } -const val TIMETABLE_HEIGHT_PER_HOUR = 48 -const val TIMETABLE_HEIGHT_PER_10MINUTE = 8 - internal fun timetableCellColorToHex(color: TimetableCellColor): Long { return when (color) { TimetableCellColor.BROWN -> 0xFFC28F62 @@ -51,6 +53,9 @@ internal fun timetableCellColorToHex(color: TimetableCellColor): Long { } } +internal val timetableHeightPerHour = 48.dp +internal val timetableHeightPer10Minute = 8.dp + @Composable fun TimetableCell( modifier: Modifier = Modifier, @@ -65,22 +70,31 @@ fun TimetableCell( TimetableCellType.CLASSNAME_PROFESSOR_LOCATION -> (true to true) } - val height = (data.endTime - data.startTime) * TIMETABLE_HEIGHT_PER_HOUR - TIMETABLE_HEIGHT_PER_10MINUTE + val height = (data.endTime - data.startTime) * timetableHeightPerHour Column( modifier = modifier .fillMaxWidth() - .height(height.dp) - .background(Color(timetableCellColorToHex(data.color))) + .height(height) + .border(width = 0.5.dp, color = Color.Gray) + .padding(0.5.dp) .suwikiClickable { onClick(data) }, ) { - Text(text = data.name) + Column( + modifier = Modifier + .weight(1f) + .background(Color(timetableCellColorToHex(data.color))), + ) { + Text(text = data.name) + + if (showProfessor) Text(text = data.professor) - if (showProfessor) Text(text = data.professor) + if (showLocation) Text(text = data.location) + } - if (showLocation) Text(text = data.location) + Spacer(modifier = Modifier.size(timetableHeightPer10Minute)) } } From 81f2508c0d5a542d91899795ff14569f52db26ec Mon Sep 17 00:00:00 2001 From: jinukeu Date: Sat, 9 Dec 2023 18:34:19 +0900 Subject: [PATCH 07/18] rename: TimetableCell -> TimetableClassCell --- .../{TimetableCell.kt => TimetableClassCell.kt} | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) rename core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/{TimetableCell.kt => TimetableClassCell.kt} (96%) diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt similarity index 96% rename from core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCell.kt rename to core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt index f6779f850..f0bbc833c 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt @@ -57,7 +57,7 @@ internal val timetableHeightPerHour = 48.dp internal val timetableHeightPer10Minute = 8.dp @Composable -fun TimetableCell( +fun TimetableClassCell( modifier: Modifier = Modifier, type: TimetableCellType = TimetableCellType.CLASSNAME_PROFESSOR_LOCATION, data: TimetableCell, @@ -100,11 +100,11 @@ fun TimetableCell( @Preview @Composable -fun TimetableCellPreview() { +fun TimetableClassCellPreview() { Column( verticalArrangement = Arrangement.spacedBy(20.dp), ) { - TimetableCell( + TimetableClassCell( modifier = Modifier.width(50.dp), type = TimetableCellType.CLASSNAME, data = TimetableCell( @@ -118,7 +118,7 @@ fun TimetableCellPreview() { ), ) - TimetableCell( + TimetableClassCell( modifier = Modifier.width(50.dp), type = TimetableCellType.CLASSNAME_PROFESSOR, data = TimetableCell( @@ -132,7 +132,7 @@ fun TimetableCellPreview() { ), ) - TimetableCell( + TimetableClassCell( modifier = Modifier.width(50.dp), type = TimetableCellType.CLASSNAME_LOCATION, data = TimetableCell( @@ -146,7 +146,7 @@ fun TimetableCellPreview() { ), ) - TimetableCell( + TimetableClassCell( modifier = Modifier.width(50.dp), type = TimetableCellType.CLASSNAME_PROFESSOR_LOCATION, data = TimetableCell( From 338575cd5e3bcc98d158091e191f5ccade389cc1 Mon Sep 17 00:00:00 2001 From: jinukeu Date: Sat, 9 Dec 2023 18:41:52 +0900 Subject: [PATCH 08/18] =?UTF-8?q?rename:=20TimetableEmptyCell=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/timetable/Common.kt | 8 ++++ .../component/timetable/TimetableClassCell.kt | 7 +-- .../component/timetable/TimetableEmptyCell.kt | 47 +++++++++++++++++++ 3 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt create mode 100644 core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt new file mode 100644 index 000000000..df0d06ff7 --- /dev/null +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt @@ -0,0 +1,8 @@ +package com.suwiki.core.designsystem.component.timetable + +import androidx.compose.ui.unit.dp + +internal val timetableHeightPerHour = 48.dp +internal val timetableHeightPer10Minute = 8.dp + +internal val timetableBorderWidth = 0.5.dp diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt index f0bbc833c..c5b84de0d 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt @@ -53,9 +53,6 @@ internal fun timetableCellColorToHex(color: TimetableCellColor): Long { } } -internal val timetableHeightPerHour = 48.dp -internal val timetableHeightPer10Minute = 8.dp - @Composable fun TimetableClassCell( modifier: Modifier = Modifier, @@ -76,8 +73,8 @@ fun TimetableClassCell( modifier = modifier .fillMaxWidth() .height(height) - .border(width = 0.5.dp, color = Color.Gray) - .padding(0.5.dp) + .border(width = timetableBorderWidth, color = Color.Gray) + .padding(timetableBorderWidth) .suwikiClickable { onClick(data) }, diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt new file mode 100644 index 000000000..74f67ce2b --- /dev/null +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt @@ -0,0 +1,47 @@ +package com.suwiki.core.designsystem.component.timetable + +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.times + +@Composable +fun TimetableEmptyCell( + modifier: Modifier = Modifier, + text: String? = null, +) { + Column( + modifier = modifier + .fillMaxWidth() + .height(timetableHeightPerHour) + .border(width = timetableBorderWidth, color = Color.Gray) + .padding(timetableBorderWidth), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + if (text != null) Text(text = text) + } +} + +@Preview(showBackground = true) +@Composable +fun TimetableEmptyCellPreview() { + Column( + verticalArrangement = Arrangement.spacedBy(20.dp), + ) { + TimetableEmptyCell() + + TimetableEmptyCell(text = "월") + } +} From 80196d272c9901e11a92b948691c9a033f6faba9 Mon Sep 17 00:00:00 2001 From: jinukeu Date: Sat, 9 Dec 2023 22:32:36 +0900 Subject: [PATCH 09/18] =?UTF-8?q?feat:=20TimetableDay=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/model/timetable/{TimetableCellColor.kt => Enums.kt} | 4 ++++ .../java/com/suwiki/core/model/timetable/TimetableCell.kt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) rename core/model/src/main/java/com/suwiki/core/model/timetable/{TimetableCellColor.kt => Enums.kt} (82%) diff --git a/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCellColor.kt b/core/model/src/main/java/com/suwiki/core/model/timetable/Enums.kt similarity index 82% rename from core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCellColor.kt rename to core/model/src/main/java/com/suwiki/core/model/timetable/Enums.kt index f0fc1b50f..9b273e7b8 100644 --- a/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCellColor.kt +++ b/core/model/src/main/java/com/suwiki/core/model/timetable/Enums.kt @@ -22,3 +22,7 @@ enum class TimetableCellColor { SKY, VIOLET_LIGHT, } + +enum class TimetableDay { + MON, TUE, WED, THU, FRI, SAT, NONE +} diff --git a/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt b/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt index 47ed6f574..fb6db16d0 100644 --- a/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt +++ b/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt @@ -7,7 +7,7 @@ data class TimetableCell( val name: String = "", val professor: String = "", val location: String = "", - val day: String = "", + val day: TimetableDay = TimetableDay.NONE, val startTime: Int = 0, val endTime: Int = 0, val color: TimetableCellColor, From 0702546fbb340cf7c2bec811333756f91a24a446 Mon Sep 17 00:00:00 2001 From: jinukeu Date: Sun, 10 Dec 2023 01:29:21 +0900 Subject: [PATCH 10/18] =?UTF-8?q?feat:=20TimetableCellColumn=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/timetable/Common.kt | 4 +- .../timetable/TimetableCellColumn.kt | 147 ++++++++++++++++++ .../component/timetable/TimetableClassCell.kt | 39 ++--- .../component/timetable/TimetableEmptyCell.kt | 3 +- .../src/main/res/values/strings.xml | 10 ++ .../com/suwiki/core/model/timetable/Enums.kt | 2 +- .../core/model/timetable/TimetableCell.kt | 6 +- 7 files changed, 179 insertions(+), 32 deletions(-) create mode 100644 core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt create mode 100644 core/designsystem/src/main/res/values/strings.xml diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt index df0d06ff7..f50af39a4 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt @@ -3,6 +3,8 @@ package com.suwiki.core.designsystem.component.timetable import androidx.compose.ui.unit.dp internal val timetableHeightPerHour = 48.dp -internal val timetableHeightPer10Minute = 8.dp internal val timetableBorderWidth = 0.5.dp + +const val HOUR_TO_MIN = 60 +const val HALF_HOUR_TO_MIN = 30 diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt new file mode 100644 index 000000000..c5d8e780a --- /dev/null +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt @@ -0,0 +1,147 @@ +package com.suwiki.core.designsystem.component.timetable + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import com.suwiki.core.designsystem.R +import com.suwiki.core.model.timetable.TimetableCell +import com.suwiki.core.model.timetable.TimetableCellColor +import com.suwiki.core.model.timetable.TimetableDay +import kotlin.math.max + +private const val MIN_END_TIME = 8 + +@Composable +internal fun timetableDayToString(day: TimetableDay): String { + return when (day) { + TimetableDay.MON -> stringResource(R.string.word_mon) + TimetableDay.TUE -> stringResource(R.string.word_tue) + TimetableDay.WED -> stringResource(R.string.word_wed) + TimetableDay.THU -> stringResource(R.string.word_thu) + TimetableDay.FRI -> stringResource(R.string.word_fri) + TimetableDay.SAT -> stringResource(R.string.word_sat) + TimetableDay.E_LEARNING -> stringResource(R.string.word_elearning) + } +} + +internal fun Int.toMinute(): Int { + return (this + 8) * HOUR_TO_MIN + HALF_HOUR_TO_MIN +} + +internal fun Int.isNotOnTime(): Boolean { + return this % HOUR_TO_MIN == HALF_HOUR_TO_MIN +} + +@Composable +fun TimetableCellColumn( + modifier: Modifier = Modifier, + day: TimetableDay, + cellList: List, + endPeriod: Int, +) { + val sortedCellList = cellList.sortedBy { it.startPeriod } + Column( + modifier = modifier, + ) { + TimetableEmptyCell( + text = timetableDayToString(day), + ) + + var emptyStartTime = 9 * HOUR_TO_MIN + sortedCellList.forEach { cell -> + val emptyEndTime = cell.startPeriod.toMinute() + + while (emptyStartTime < emptyEndTime) { + val insertEmptyTimeAmount = when { + // 정각이 아니거나 종료 시간까지 30분이 남은 경우, 30분을 채운다. + emptyStartTime.isNotOnTime() || emptyEndTime - emptyStartTime == HALF_HOUR_TO_MIN -> { + HALF_HOUR_TO_MIN + } + // 그렇지 않다면 1시간을 채운다. + else -> { + HOUR_TO_MIN + } + } + TimetableEmptyCell( + minute = insertEmptyTimeAmount + ) + emptyStartTime += insertEmptyTimeAmount + } + + TimetableClassCell(data = cell) + + emptyStartTime = cell.endPeriod.toMinute() + } + + if (emptyStartTime.isNotOnTime()) { + TimetableEmptyCell( + minute = HALF_HOUR_TO_MIN + ) + + emptyStartTime += HALF_HOUR_TO_MIN + } + + while (emptyStartTime < max(endPeriod, MIN_END_TIME).toMinute()) { + TimetableEmptyCell( + minute = HOUR_TO_MIN + ) + + emptyStartTime += HOUR_TO_MIN + } + } +} + +@Preview(showSystemUi = true) +@Composable +fun TimetableCellColumnPreview() { + Row( + modifier = Modifier.fillMaxWidth(), + ) { + Column( + modifier = Modifier.weight(1f), + ) { + TimetableEmptyCell(text = "") + repeat(8) { + TimetableEmptyCell(text = "${it + 9}") + } + } + + repeat(5) { + TimetableCellColumn( + modifier = Modifier.weight(1f), + day = TimetableDay.FRI, + cellList = listOf( + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + startPeriod = 1, + endPeriod = 3, + color = TimetableCellColor.GREEN, + ), + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + startPeriod = 4, + endPeriod = 5, + color = TimetableCellColor.PINK, + ), + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + startPeriod = 5, + endPeriod = 6, + color = TimetableCellColor.BROWN, + ), + ), + endPeriod = 3, + ) + } + } +} diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt index c5b84de0d..35eb14112 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt @@ -4,11 +4,9 @@ import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -67,7 +65,7 @@ fun TimetableClassCell( TimetableCellType.CLASSNAME_PROFESSOR_LOCATION -> (true to true) } - val height = (data.endTime - data.startTime) * timetableHeightPerHour + val height = (data.endPeriod - data.startPeriod) * timetableHeightPerHour Column( modifier = modifier @@ -75,23 +73,16 @@ fun TimetableClassCell( .height(height) .border(width = timetableBorderWidth, color = Color.Gray) .padding(timetableBorderWidth) + .background(Color(timetableCellColorToHex(data.color))) .suwikiClickable { onClick(data) }, ) { - Column( - modifier = Modifier - .weight(1f) - .background(Color(timetableCellColorToHex(data.color))), - ) { - Text(text = data.name) + Text(text = data.name) - if (showProfessor) Text(text = data.professor) + if (showProfessor) Text(text = data.professor) - if (showLocation) Text(text = data.location) - } - - Spacer(modifier = Modifier.size(timetableHeightPer10Minute)) + if (showLocation) Text(text = data.location) } } @@ -108,9 +99,8 @@ fun TimetableClassCellPreview() { name = "도전과 창조", professor = "김수미", location = "미래혁신관B202", - day = "", - startTime = 1, - endTime = 3, + startPeriod = 1, + endPeriod = 3, color = TimetableCellColor.GREEN, ), ) @@ -122,9 +112,8 @@ fun TimetableClassCellPreview() { name = "도전과 창조", professor = "김수미", location = "미래혁신관B202", - day = "", - startTime = 1, - endTime = 3, + startPeriod = 1, + endPeriod = 3, color = TimetableCellColor.GREEN, ), ) @@ -136,9 +125,8 @@ fun TimetableClassCellPreview() { name = "도전과 창조", professor = "김수미", location = "미래혁신관B202", - day = "", - startTime = 1, - endTime = 3, + startPeriod = 1, + endPeriod = 3, color = TimetableCellColor.GREEN, ), ) @@ -150,9 +138,8 @@ fun TimetableClassCellPreview() { name = "도전과 창조", professor = "김수미", location = "미래혁신관B202", - day = "", - startTime = 1, - endTime = 3, + startPeriod = 1, + endPeriod = 3, color = TimetableCellColor.GREEN, ), ) diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt index 74f67ce2b..15f5be95b 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt @@ -19,12 +19,13 @@ import androidx.compose.ui.unit.times @Composable fun TimetableEmptyCell( modifier: Modifier = Modifier, + minute: Int = HOUR_TO_MIN, text: String? = null, ) { Column( modifier = modifier .fillMaxWidth() - .height(timetableHeightPerHour) + .height(timetableHeightPerHour * minute / HOUR_TO_MIN) .border(width = timetableBorderWidth, color = Color.Gray) .padding(timetableBorderWidth), verticalArrangement = Arrangement.Center, diff --git a/core/designsystem/src/main/res/values/strings.xml b/core/designsystem/src/main/res/values/strings.xml new file mode 100644 index 000000000..4c33e316e --- /dev/null +++ b/core/designsystem/src/main/res/values/strings.xml @@ -0,0 +1,10 @@ + + + + + + + + + 이러닝 + diff --git a/core/model/src/main/java/com/suwiki/core/model/timetable/Enums.kt b/core/model/src/main/java/com/suwiki/core/model/timetable/Enums.kt index 9b273e7b8..068d390b0 100644 --- a/core/model/src/main/java/com/suwiki/core/model/timetable/Enums.kt +++ b/core/model/src/main/java/com/suwiki/core/model/timetable/Enums.kt @@ -24,5 +24,5 @@ enum class TimetableCellColor { } enum class TimetableDay { - MON, TUE, WED, THU, FRI, SAT, NONE + MON, TUE, WED, THU, FRI, SAT, E_LEARNING } diff --git a/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt b/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt index fb6db16d0..382ec3bd4 100644 --- a/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt +++ b/core/model/src/main/java/com/suwiki/core/model/timetable/TimetableCell.kt @@ -7,9 +7,9 @@ data class TimetableCell( val name: String = "", val professor: String = "", val location: String = "", - val day: TimetableDay = TimetableDay.NONE, - val startTime: Int = 0, - val endTime: Int = 0, + val day: TimetableDay = TimetableDay.E_LEARNING, + val startPeriod: Int = 0, + val endPeriod: Int = 0, val color: TimetableCellColor, val credit: String = "", ) From 97c1c7a8fe0035880175784f785c294b96356b8f Mon Sep 17 00:00:00 2001 From: jinukeu Date: Sun, 10 Dec 2023 12:50:02 +0900 Subject: [PATCH 11/18] =?UTF-8?q?refactor:=20TimetableCellColumn=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../timetable/TimetableCellColumn.kt | 72 +++++++++---------- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt index c5d8e780a..24a9572c9 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt @@ -11,9 +11,6 @@ import com.suwiki.core.designsystem.R import com.suwiki.core.model.timetable.TimetableCell import com.suwiki.core.model.timetable.TimetableCellColor import com.suwiki.core.model.timetable.TimetableDay -import kotlin.math.max - -private const val MIN_END_TIME = 8 @Composable internal fun timetableDayToString(day: TimetableDay): String { @@ -28,10 +25,14 @@ internal fun timetableDayToString(day: TimetableDay): String { } } -internal fun Int.toMinute(): Int { +internal fun Int.classPeriodToMinute(): Int { return (this + 8) * HOUR_TO_MIN + HALF_HOUR_TO_MIN } +internal fun Int.periodToMinute(): Int { + return (this + 8) * HOUR_TO_MIN +} + internal fun Int.isNotOnTime(): Boolean { return this % HOUR_TO_MIN == HALF_HOUR_TO_MIN } @@ -41,7 +42,7 @@ fun TimetableCellColumn( modifier: Modifier = Modifier, day: TimetableDay, cellList: List, - endPeriod: Int, + lastPeriod: Int, ) { val sortedCellList = cellList.sortedBy { it.startPeriod } Column( @@ -53,45 +54,36 @@ fun TimetableCellColumn( var emptyStartTime = 9 * HOUR_TO_MIN sortedCellList.forEach { cell -> - val emptyEndTime = cell.startPeriod.toMinute() - - while (emptyStartTime < emptyEndTime) { - val insertEmptyTimeAmount = when { - // 정각이 아니거나 종료 시간까지 30분이 남은 경우, 30분을 채운다. - emptyStartTime.isNotOnTime() || emptyEndTime - emptyStartTime == HALF_HOUR_TO_MIN -> { - HALF_HOUR_TO_MIN - } - // 그렇지 않다면 1시간을 채운다. - else -> { - HOUR_TO_MIN - } - } - TimetableEmptyCell( - minute = insertEmptyTimeAmount - ) - emptyStartTime += insertEmptyTimeAmount - } - + val emptyEndTime = cell.startPeriod.classPeriodToMinute() + FillEmptyTime(emptyStartTime, emptyEndTime) TimetableClassCell(data = cell) - - emptyStartTime = cell.endPeriod.toMinute() + emptyStartTime = cell.endPeriod.classPeriodToMinute() } - if (emptyStartTime.isNotOnTime()) { - TimetableEmptyCell( - minute = HALF_HOUR_TO_MIN - ) + FillEmptyTime(emptyStartTime, (lastPeriod + 1).periodToMinute()) + } +} - emptyStartTime += HALF_HOUR_TO_MIN +@Composable +fun FillEmptyTime(emptyStartTime: Int, emptyEndTime: Int) { + var filledEmptyTime = emptyStartTime + + while (filledEmptyTime < emptyEndTime) { + val insertEmptyTimeAmount = when { + // 정각이 아니거나 종료 시간까지 30분이 남은 경우, 30분을 채운다. + filledEmptyTime.isNotOnTime() || emptyEndTime - filledEmptyTime == HALF_HOUR_TO_MIN -> { + HALF_HOUR_TO_MIN + } + // 그렇지 않다면 1시간을 채운다. + else -> { + HOUR_TO_MIN + } } + TimetableEmptyCell( + minute = insertEmptyTimeAmount + ) - while (emptyStartTime < max(endPeriod, MIN_END_TIME).toMinute()) { - TimetableEmptyCell( - minute = HOUR_TO_MIN - ) - - emptyStartTime += HOUR_TO_MIN - } + filledEmptyTime += insertEmptyTimeAmount } } @@ -136,11 +128,11 @@ fun TimetableCellColumnPreview() { professor = "김수미", location = "미래혁신관B202", startPeriod = 5, - endPeriod = 6, + endPeriod = 8, color = TimetableCellColor.BROWN, ), ), - endPeriod = 3, + lastPeriod = 8, ) } } From c7ca182550aec648b3407bba5a901a5f2eba6362 Mon Sep 17 00:00:00 2001 From: jinukeu Date: Sun, 10 Dec 2023 20:27:59 +0900 Subject: [PATCH 12/18] =?UTF-8?q?refactor/#35:=20TimetableCellColumn=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/timetable/Common.kt | 4 +- .../timetable/TimetableCellColumn.kt | 51 +++++++++++-------- .../component/timetable/TimetableClassCell.kt | 2 +- .../component/timetable/TimetableEmptyCell.kt | 6 +-- 4 files changed, 35 insertions(+), 28 deletions(-) diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt index f50af39a4..49814bdc2 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt @@ -6,5 +6,5 @@ internal val timetableHeightPerHour = 48.dp internal val timetableBorderWidth = 0.5.dp -const val HOUR_TO_MIN = 60 -const val HALF_HOUR_TO_MIN = 30 +const val MINUTE60 = 60 +const val MINUTE10 = 10 diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt index 24a9572c9..f80fe7fe6 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt @@ -25,16 +25,18 @@ internal fun timetableDayToString(day: TimetableDay): String { } } -internal fun Int.classPeriodToMinute(): Int { - return (this + 8) * HOUR_TO_MIN + HALF_HOUR_TO_MIN +internal fun TimetableCell.getStartAndEndMinute(): Pair { + val startMinute = (this.startPeriod + 8) * MINUTE60 + 3 * MINUTE10 + val endMinute = (this.endPeriod + 9) * MINUTE60 + 2 * MINUTE10 + return (startMinute to endMinute) } -internal fun Int.periodToMinute(): Int { - return (this + 8) * HOUR_TO_MIN +internal fun Int.endPeriodToMinute(): Int { + return (this + 9) * MINUTE60 } internal fun Int.isNotOnTime(): Boolean { - return this % HOUR_TO_MIN == HALF_HOUR_TO_MIN + return this % MINUTE60 != 0 } @Composable @@ -52,15 +54,15 @@ fun TimetableCellColumn( text = timetableDayToString(day), ) - var emptyStartTime = 9 * HOUR_TO_MIN + var prevEndTime = 9 * MINUTE60 sortedCellList.forEach { cell -> - val emptyEndTime = cell.startPeriod.classPeriodToMinute() - FillEmptyTime(emptyStartTime, emptyEndTime) + val (startMinute, endMinute) = cell.getStartAndEndMinute() + FillEmptyTime(prevEndTime, startMinute) TimetableClassCell(data = cell) - emptyStartTime = cell.endPeriod.classPeriodToMinute() + prevEndTime = endMinute } - FillEmptyTime(emptyStartTime, (lastPeriod + 1).periodToMinute()) + FillEmptyTime(prevEndTime, lastPeriod.endPeriodToMinute()) } } @@ -70,17 +72,24 @@ fun FillEmptyTime(emptyStartTime: Int, emptyEndTime: Int) { while (filledEmptyTime < emptyEndTime) { val insertEmptyTimeAmount = when { - // 정각이 아니거나 종료 시간까지 30분이 남은 경우, 30분을 채운다. - filledEmptyTime.isNotOnTime() || emptyEndTime - filledEmptyTime == HALF_HOUR_TO_MIN -> { - HALF_HOUR_TO_MIN + // 종료 시각까지 1시간이 안되는 경우, 종료 시각까지 남은 시간을 채운다. + emptyEndTime - filledEmptyTime < MINUTE60 -> { + emptyEndTime - filledEmptyTime } + + // 정각이 아닌 경우 정각까지 남은 시간을 채운다. + filledEmptyTime.isNotOnTime() -> { + MINUTE60 - filledEmptyTime % MINUTE60 + } + // 그렇지 않다면 1시간을 채운다. else -> { - HOUR_TO_MIN + MINUTE60 } } + TimetableEmptyCell( - minute = insertEmptyTimeAmount + minute = insertEmptyTimeAmount, ) filledEmptyTime += insertEmptyTimeAmount @@ -102,7 +111,7 @@ fun TimetableCellColumnPreview() { } } - repeat(5) { + repeat(1) { TimetableCellColumn( modifier = Modifier.weight(1f), day = TimetableDay.FRI, @@ -112,23 +121,23 @@ fun TimetableCellColumnPreview() { professor = "김수미", location = "미래혁신관B202", startPeriod = 1, - endPeriod = 3, + endPeriod = 2, color = TimetableCellColor.GREEN, ), TimetableCell( name = "도전과 창조", professor = "김수미", location = "미래혁신관B202", - startPeriod = 4, - endPeriod = 5, + startPeriod = 3, + endPeriod = 4, color = TimetableCellColor.PINK, ), TimetableCell( name = "도전과 창조", professor = "김수미", location = "미래혁신관B202", - startPeriod = 5, - endPeriod = 8, + startPeriod = 6, + endPeriod = 6, color = TimetableCellColor.BROWN, ), ), diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt index 35eb14112..6518c779a 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt @@ -65,7 +65,7 @@ fun TimetableClassCell( TimetableCellType.CLASSNAME_PROFESSOR_LOCATION -> (true to true) } - val height = (data.endPeriod - data.startPeriod) * timetableHeightPerHour + val height = (data.endPeriod - data.startPeriod + 1) * timetableHeightPerHour - 8.dp Column( modifier = modifier diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt index 15f5be95b..9f871cec5 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -14,18 +13,17 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.times @Composable fun TimetableEmptyCell( modifier: Modifier = Modifier, - minute: Int = HOUR_TO_MIN, + minute: Int = MINUTE60, text: String? = null, ) { Column( modifier = modifier .fillMaxWidth() - .height(timetableHeightPerHour * minute / HOUR_TO_MIN) + .height(timetableHeightPerHour * minute / MINUTE60) .border(width = timetableBorderWidth, color = Color.Gray) .padding(timetableBorderWidth), verticalArrangement = Arrangement.Center, From 65b85dd346d6c086df8b8a1fed155715a2a6230e Mon Sep 17 00:00:00 2001 From: jinukeu Date: Wed, 13 Dec 2023 15:11:23 +0900 Subject: [PATCH 13/18] =?UTF-8?q?design/#35:=20design=20system=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../timetable/TimetableCellColumn.kt | 84 +++++------ .../component/timetable/TimetableClassCell.kt | 131 ++++++++++-------- .../component/timetable/TimetableEmptyCell.kt | 29 ++-- 3 files changed, 141 insertions(+), 103 deletions(-) diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt index f80fe7fe6..41db6d1a5 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt @@ -8,6 +8,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.suwiki.core.designsystem.R +import com.suwiki.core.designsystem.theme.SuwikiTheme import com.suwiki.core.model.timetable.TimetableCell import com.suwiki.core.model.timetable.TimetableCellColor import com.suwiki.core.model.timetable.TimetableDay @@ -99,50 +100,53 @@ fun FillEmptyTime(emptyStartTime: Int, emptyEndTime: Int) { @Preview(showSystemUi = true) @Composable fun TimetableCellColumnPreview() { - Row( - modifier = Modifier.fillMaxWidth(), - ) { - Column( - modifier = Modifier.weight(1f), + SuwikiTheme { + Row( + modifier = Modifier + .fillMaxWidth(), ) { - TimetableEmptyCell(text = "") - repeat(8) { - TimetableEmptyCell(text = "${it + 9}") + Column( + modifier = Modifier.weight(1f), + ) { + TimetableEmptyCell(text = "") + repeat(8) { + TimetableEmptyCell(text = "${it + 9}") + } } - } - repeat(1) { - TimetableCellColumn( - modifier = Modifier.weight(1f), - day = TimetableDay.FRI, - cellList = listOf( - TimetableCell( - name = "도전과 창조", - professor = "김수미", - location = "미래혁신관B202", - startPeriod = 1, - endPeriod = 2, - color = TimetableCellColor.GREEN, + repeat(5) { + TimetableCellColumn( + modifier = Modifier.weight(1f), + day = TimetableDay.FRI, + cellList = listOf( + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + startPeriod = 1, + endPeriod = 2, + color = TimetableCellColor.GREEN, + ), + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + startPeriod = 3, + endPeriod = 4, + color = TimetableCellColor.PINK, + ), + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + startPeriod = 6, + endPeriod = 6, + color = TimetableCellColor.BROWN, + ), ), - TimetableCell( - name = "도전과 창조", - professor = "김수미", - location = "미래혁신관B202", - startPeriod = 3, - endPeriod = 4, - color = TimetableCellColor.PINK, - ), - TimetableCell( - name = "도전과 창조", - professor = "김수미", - location = "미래혁신관B202", - startPeriod = 6, - endPeriod = 6, - color = TimetableCellColor.BROWN, - ), - ), - lastPeriod = 8, - ) + lastPeriod = 8, + ) + } } } } diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt index 6518c779a..f8c844754 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt @@ -15,6 +15,9 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.times +import com.suwiki.core.designsystem.theme.GrayF6 +import com.suwiki.core.designsystem.theme.SuwikiTheme +import com.suwiki.core.designsystem.theme.White import com.suwiki.core.model.timetable.TimetableCell import com.suwiki.core.model.timetable.TimetableCellColor import com.suwiki.core.ui.extension.suwikiClickable @@ -71,77 +74,95 @@ fun TimetableClassCell( modifier = modifier .fillMaxWidth() .height(height) - .border(width = timetableBorderWidth, color = Color.Gray) + .border(width = timetableBorderWidth, color = GrayF6) .padding(timetableBorderWidth) .background(Color(timetableCellColorToHex(data.color))) .suwikiClickable { onClick(data) }, ) { - Text(text = data.name) + Text( + style = SuwikiTheme.typography.caption3, + text = data.name, + color = White, + ) - if (showProfessor) Text(text = data.professor) + if (showProfessor) { + Text( + style = SuwikiTheme.typography.caption6, + text = data.professor, + color = White, + ) + } - if (showLocation) Text(text = data.location) + if (showLocation) { + Text( + style = SuwikiTheme.typography.caption6, + text = data.location, + color = White, + ) + } } } @Preview @Composable fun TimetableClassCellPreview() { - Column( - verticalArrangement = Arrangement.spacedBy(20.dp), - ) { - TimetableClassCell( - modifier = Modifier.width(50.dp), - type = TimetableCellType.CLASSNAME, - data = TimetableCell( - name = "도전과 창조", - professor = "김수미", - location = "미래혁신관B202", - startPeriod = 1, - endPeriod = 3, - color = TimetableCellColor.GREEN, - ), - ) + SuwikiTheme { + Column( + verticalArrangement = Arrangement.spacedBy(20.dp), + ) { + TimetableClassCell( + modifier = Modifier.width(50.dp), + type = TimetableCellType.CLASSNAME, + data = TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + startPeriod = 1, + endPeriod = 3, + color = TimetableCellColor.GREEN, + ), + ) - TimetableClassCell( - modifier = Modifier.width(50.dp), - type = TimetableCellType.CLASSNAME_PROFESSOR, - data = TimetableCell( - name = "도전과 창조", - professor = "김수미", - location = "미래혁신관B202", - startPeriod = 1, - endPeriod = 3, - color = TimetableCellColor.GREEN, - ), - ) + TimetableClassCell( + modifier = Modifier.width(50.dp), + type = TimetableCellType.CLASSNAME_PROFESSOR, + data = TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + startPeriod = 1, + endPeriod = 3, + color = TimetableCellColor.GREEN, + ), + ) - TimetableClassCell( - modifier = Modifier.width(50.dp), - type = TimetableCellType.CLASSNAME_LOCATION, - data = TimetableCell( - name = "도전과 창조", - professor = "김수미", - location = "미래혁신관B202", - startPeriod = 1, - endPeriod = 3, - color = TimetableCellColor.GREEN, - ), - ) + TimetableClassCell( + modifier = Modifier.width(50.dp), + type = TimetableCellType.CLASSNAME_LOCATION, + data = TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + startPeriod = 1, + endPeriod = 3, + color = TimetableCellColor.GREEN, + ), + ) - TimetableClassCell( - modifier = Modifier.width(50.dp), - type = TimetableCellType.CLASSNAME_PROFESSOR_LOCATION, - data = TimetableCell( - name = "도전과 창조", - professor = "김수미", - location = "미래혁신관B202", - startPeriod = 1, - endPeriod = 3, - color = TimetableCellColor.GREEN, - ), - ) + TimetableClassCell( + modifier = Modifier.width(50.dp), + type = TimetableCellType.CLASSNAME_PROFESSOR_LOCATION, + data = TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + startPeriod = 1, + endPeriod = 3, + color = TimetableCellColor.GREEN, + ), + ) + } } } diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt index 9f871cec5..21465f5fd 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt @@ -1,5 +1,6 @@ package com.suwiki.core.designsystem.component.timetable +import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -10,9 +11,12 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.suwiki.core.designsystem.theme.Gray6A +import com.suwiki.core.designsystem.theme.GrayF6 +import com.suwiki.core.designsystem.theme.SuwikiTheme +import com.suwiki.core.designsystem.theme.White @Composable fun TimetableEmptyCell( @@ -24,23 +28,32 @@ fun TimetableEmptyCell( modifier = modifier .fillMaxWidth() .height(timetableHeightPerHour * minute / MINUTE60) - .border(width = timetableBorderWidth, color = Color.Gray) + .border(width = timetableBorderWidth, color = GrayF6) + .background(White) .padding(timetableBorderWidth), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, ) { - if (text != null) Text(text = text) + if (text != null) { + Text( + text = text, + style = SuwikiTheme.typography.caption4, + color = Gray6A, + ) + } } } @Preview(showBackground = true) @Composable fun TimetableEmptyCellPreview() { - Column( - verticalArrangement = Arrangement.spacedBy(20.dp), - ) { - TimetableEmptyCell() + SuwikiTheme { + Column( + verticalArrangement = Arrangement.spacedBy(20.dp), + ) { + TimetableEmptyCell() - TimetableEmptyCell(text = "월") + TimetableEmptyCell(text = "월") + } } } From c212840bcba432aa71f8985db51e406662494a6b Mon Sep 17 00:00:00 2001 From: jinukeu Date: Wed, 13 Dec 2023 18:04:51 +0900 Subject: [PATCH 14/18] =?UTF-8?q?feat/#35:=20Timetable=20Component=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/timetable/Common.kt | 17 ++ .../component/timetable/Timetable.kt | 255 ++++++++++++++++++ .../ClassCell.kt} | 14 +- .../component/timetable/cell/ELearningCell.kt | 30 +++ .../EmptyCell.kt} | 11 +- .../ClassColumn.kt} | 39 ++- .../component/timetable/column/TimeColumn.kt | 22 ++ .../main/res/drawable/ic_timetable_add.xml | 10 + .../res/drawable/ic_timetable_hamburger.xml | 10 + .../res/drawable/ic_timetable_setting.xml | 12 + .../com/suwiki/core/model/timetable/Enums.kt | 4 +- 11 files changed, 388 insertions(+), 36 deletions(-) create mode 100644 core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt rename core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/{TimetableClassCell.kt => cell/ClassCell.kt} (94%) create mode 100644 core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ELearningCell.kt rename core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/{TimetableEmptyCell.kt => cell/EmptyCell.kt} (81%) rename core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/{TimetableCellColumn.kt => column/ClassColumn.kt} (78%) create mode 100644 core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/column/TimeColumn.kt create mode 100644 core/designsystem/src/main/res/drawable/ic_timetable_add.xml create mode 100644 core/designsystem/src/main/res/drawable/ic_timetable_hamburger.xml create mode 100644 core/designsystem/src/main/res/drawable/ic_timetable_setting.xml diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt index 49814bdc2..4ad39c2b3 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Common.kt @@ -1,6 +1,10 @@ package com.suwiki.core.designsystem.component.timetable +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import com.suwiki.core.designsystem.R +import com.suwiki.core.model.timetable.TimetableDay internal val timetableHeightPerHour = 48.dp @@ -8,3 +12,16 @@ internal val timetableBorderWidth = 0.5.dp const val MINUTE60 = 60 const val MINUTE10 = 10 + +@Composable +internal fun TimetableDay.toText(): String { + return when (this) { + TimetableDay.MON -> stringResource(R.string.word_mon) + TimetableDay.TUE -> stringResource(R.string.word_tue) + TimetableDay.WED -> stringResource(R.string.word_wed) + TimetableDay.THU -> stringResource(R.string.word_thu) + TimetableDay.FRI -> stringResource(R.string.word_fri) + TimetableDay.SAT -> stringResource(R.string.word_sat) + TimetableDay.E_LEARNING -> stringResource(R.string.word_elearning) + } +} diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt new file mode 100644 index 000000000..e16005bfe --- /dev/null +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt @@ -0,0 +1,255 @@ +package com.suwiki.core.designsystem.component.timetable + +import androidx.compose.foundation.ScrollState +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.suwiki.core.designsystem.R +import com.suwiki.core.designsystem.component.timetable.cell.ELearningCell +import com.suwiki.core.designsystem.component.timetable.column.TimeColumn +import com.suwiki.core.designsystem.component.timetable.column.ClassColumn +import com.suwiki.core.designsystem.theme.Black +import com.suwiki.core.designsystem.theme.Gray95 +import com.suwiki.core.designsystem.theme.GrayF6 +import com.suwiki.core.designsystem.theme.SuwikiTheme +import com.suwiki.core.model.timetable.Timetable +import com.suwiki.core.model.timetable.TimetableCell +import com.suwiki.core.model.timetable.TimetableCellColor +import com.suwiki.core.model.timetable.TimetableDay +import com.suwiki.core.ui.extension.suwikiClickable +import kotlin.math.max + +internal const val MIN_MAX_PERIOD = 8 + +internal fun List.maxPeriod(): Int { + return max((maxOfOrNull { it.endPeriod }?.plus(1)) ?: MIN_MAX_PERIOD, MIN_MAX_PERIOD) +} + +@Composable +fun Timetable( + modifier: Modifier = Modifier, + timetable: Timetable, + onClickAdd: () -> Unit = {}, + onClickHamburger: () -> Unit = {}, + onClickSetting: () -> Unit = {}, + onClickClassCell: (TimetableCell) -> Unit = { _ -> }, +) { + val scrollState = rememberScrollState() + val maxPeriod by remember { + derivedStateOf { timetable.cellList.maxPeriod() } + } + + // TODO 리컴포지션 최적화 필요 + val cellGroupedByDay = timetable.cellList.groupBy { it.day } + + Column( + modifier = modifier.fillMaxSize(), + verticalArrangement = Arrangement.spacedBy(12.dp), + ) { + Header( + name = timetable.name, + onClickAdd = onClickAdd, + onClickHamburger = onClickHamburger, + onClickSetting = onClickSetting, + ) + + Body( + scrollState = scrollState, + maxPeriod = maxPeriod, + cellGroupedByDay = cellGroupedByDay, + onClickClassCell = onClickClassCell, + ) + } +} + +@Composable +private fun Header( + modifier: Modifier = Modifier, + name: String, + onClickAdd: () -> Unit = {}, + onClickHamburger: () -> Unit = {}, + onClickSetting: () -> Unit = {}, +) { + Row( + modifier = modifier + .fillMaxWidth() + .padding(start = 24.dp, end = 20.dp), + verticalAlignment = Alignment.Bottom, + horizontalArrangement = Arrangement.spacedBy(18.dp), + ) { + Text( + modifier = Modifier.weight(1f), + overflow = TextOverflow.Ellipsis, + text = name, + style = SuwikiTheme.typography.header1, + color = Black, + maxLines = 1, + ) + + Icon( + modifier = Modifier.suwikiClickable(onClick = onClickHamburger), + painter = painterResource(id = R.drawable.ic_timetable_add), + contentDescription = "", + tint = Gray95, + ) + + Icon( + modifier = Modifier.suwikiClickable(onClick = onClickAdd), + painter = painterResource(id = R.drawable.ic_timetable_hamburger), + contentDescription = "", + tint = Gray95, + ) + + Icon( + modifier = Modifier.suwikiClickable(onClick = onClickSetting), + + painter = painterResource(id = R.drawable.ic_timetable_setting), + contentDescription = "", + tint = Gray95, + ) + } +} + +@Composable +private fun Body( + modifier: Modifier = Modifier, + scrollState: ScrollState, + maxPeriod: Int, + cellGroupedByDay: Map>, + onClickClassCell: (TimetableCell) -> Unit, +) { + Column( + modifier = modifier + .fillMaxWidth() + .border(width = timetableBorderWidth, color = GrayF6) + .verticalScroll(scrollState), + ) { + Row { + TimeColumn( + modifier = Modifier.weight(1f), + maxPeriod = maxPeriod, + ) + + TimetableDay.entries + .sortedBy { it.idx } + .filter { it !in listOf(TimetableDay.SAT, TimetableDay.E_LEARNING) } + .forEach { day -> + ClassColumn( + modifier = Modifier.weight(1f), + day = day, + cellList = cellGroupedByDay[day] ?: emptyList(), + lastPeriod = maxPeriod, + onClickClassCell = onClickClassCell, + ) + } + } + + cellGroupedByDay + .filter { it.key in listOf(TimetableDay.SAT, TimetableDay.E_LEARNING) } + .flatMap { it.value } + .forEach { cell -> + ELearningCell( + onClickClassCell = onClickClassCell, + cell = cell, + ) + } + } +} + +@Preview(showSystemUi = true) +@Composable +fun TimetablePreview() { + SuwikiTheme { + Timetable( + timetable = Timetable( + createTime = 0L, + year = "", + semester = "", + name = "Previewaaaaaaaaaeeeeeaaaa", + cellList = listOf( + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + day = TimetableDay.E_LEARNING, + startPeriod = 7, + endPeriod = 8, + color = TimetableCellColor.GREEN, + ), + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + day = TimetableDay.SAT, + startPeriod = 7, + endPeriod = 8, + color = TimetableCellColor.GREEN, + ), + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + day = TimetableDay.E_LEARNING, + startPeriod = 0, + endPeriod = 0, + color = TimetableCellColor.GREEN, + ), + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + day = TimetableDay.MON, + startPeriod = 7, + endPeriod = 8, + color = TimetableCellColor.GREEN, + ), + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + day = TimetableDay.FRI, + startPeriod = 1, + endPeriod = 2, + color = TimetableCellColor.GREEN, + ), + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + day = TimetableDay.FRI, + startPeriod = 3, + endPeriod = 4, + color = TimetableCellColor.PINK, + ), + TimetableCell( + name = "도전과 창조", + professor = "김수미", + location = "미래혁신관B202", + day = TimetableDay.FRI, + startPeriod = 6, + endPeriod = 6, + color = TimetableCellColor.BROWN, + ), + ), + ), + ) + } +} diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ClassCell.kt similarity index 94% rename from core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt rename to core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ClassCell.kt index f8c844754..58ff2de63 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableClassCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ClassCell.kt @@ -1,4 +1,4 @@ -package com.suwiki.core.designsystem.component.timetable +package com.suwiki.core.designsystem.component.timetable.cell import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -15,6 +15,8 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.times +import com.suwiki.core.designsystem.component.timetable.timetableBorderWidth +import com.suwiki.core.designsystem.component.timetable.timetableHeightPerHour import com.suwiki.core.designsystem.theme.GrayF6 import com.suwiki.core.designsystem.theme.SuwikiTheme import com.suwiki.core.designsystem.theme.White @@ -55,7 +57,7 @@ internal fun timetableCellColorToHex(color: TimetableCellColor): Long { } @Composable -fun TimetableClassCell( +internal fun ClassCell( modifier: Modifier = Modifier, type: TimetableCellType = TimetableCellType.CLASSNAME_PROFESSOR_LOCATION, data: TimetableCell, @@ -112,7 +114,7 @@ fun TimetableClassCellPreview() { Column( verticalArrangement = Arrangement.spacedBy(20.dp), ) { - TimetableClassCell( + ClassCell( modifier = Modifier.width(50.dp), type = TimetableCellType.CLASSNAME, data = TimetableCell( @@ -125,7 +127,7 @@ fun TimetableClassCellPreview() { ), ) - TimetableClassCell( + ClassCell( modifier = Modifier.width(50.dp), type = TimetableCellType.CLASSNAME_PROFESSOR, data = TimetableCell( @@ -138,7 +140,7 @@ fun TimetableClassCellPreview() { ), ) - TimetableClassCell( + ClassCell( modifier = Modifier.width(50.dp), type = TimetableCellType.CLASSNAME_LOCATION, data = TimetableCell( @@ -151,7 +153,7 @@ fun TimetableClassCellPreview() { ), ) - TimetableClassCell( + ClassCell( modifier = Modifier.width(50.dp), type = TimetableCellType.CLASSNAME_PROFESSOR_LOCATION, data = TimetableCell( diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ELearningCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ELearningCell.kt new file mode 100644 index 000000000..b507f5385 --- /dev/null +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ELearningCell.kt @@ -0,0 +1,30 @@ +package com.suwiki.core.designsystem.component.timetable.cell + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.suwiki.core.designsystem.component.timetable.toText +import com.suwiki.core.model.timetable.TimetableCell +import com.suwiki.core.ui.extension.suwikiClickable + +@Composable +internal fun ELearningCell( + modifier: Modifier = Modifier, + cell: TimetableCell, + onClickClassCell: (TimetableCell) -> Unit = { _ -> }, +) { + val nameAndDay = "${cell.name} / ${cell.day.toText()}" + val period = "(${cell.startPeriod} ~ ${cell.endPeriod})" + + val text = if (cell.startPeriod != 0 && cell.endPeriod != 0) nameAndDay + period + else nameAndDay + + EmptyCell( + modifier = modifier + .fillMaxWidth() + .suwikiClickable { + onClickClassCell(cell) + }, + text = text, + ) +} diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/EmptyCell.kt similarity index 81% rename from core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt rename to core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/EmptyCell.kt index 21465f5fd..fca818da3 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableEmptyCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/EmptyCell.kt @@ -1,4 +1,4 @@ -package com.suwiki.core.designsystem.component.timetable +package com.suwiki.core.designsystem.component.timetable.cell import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -13,13 +13,16 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.suwiki.core.designsystem.component.timetable.MINUTE60 +import com.suwiki.core.designsystem.component.timetable.timetableBorderWidth +import com.suwiki.core.designsystem.component.timetable.timetableHeightPerHour import com.suwiki.core.designsystem.theme.Gray6A import com.suwiki.core.designsystem.theme.GrayF6 import com.suwiki.core.designsystem.theme.SuwikiTheme import com.suwiki.core.designsystem.theme.White @Composable -fun TimetableEmptyCell( +internal fun EmptyCell( modifier: Modifier = Modifier, minute: Int = MINUTE60, text: String? = null, @@ -51,9 +54,9 @@ fun TimetableEmptyCellPreview() { Column( verticalArrangement = Arrangement.spacedBy(20.dp), ) { - TimetableEmptyCell() + EmptyCell() - TimetableEmptyCell(text = "월") + EmptyCell(text = "월") } } } diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/column/ClassColumn.kt similarity index 78% rename from core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt rename to core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/column/ClassColumn.kt index 41db6d1a5..7a66847a5 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/TimetableCellColumn.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/column/ClassColumn.kt @@ -1,31 +1,21 @@ -package com.suwiki.core.designsystem.component.timetable +package com.suwiki.core.designsystem.component.timetable.column import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import com.suwiki.core.designsystem.R +import com.suwiki.core.designsystem.component.timetable.MINUTE10 +import com.suwiki.core.designsystem.component.timetable.MINUTE60 +import com.suwiki.core.designsystem.component.timetable.cell.ClassCell +import com.suwiki.core.designsystem.component.timetable.cell.EmptyCell +import com.suwiki.core.designsystem.component.timetable.toText import com.suwiki.core.designsystem.theme.SuwikiTheme import com.suwiki.core.model.timetable.TimetableCell import com.suwiki.core.model.timetable.TimetableCellColor import com.suwiki.core.model.timetable.TimetableDay -@Composable -internal fun timetableDayToString(day: TimetableDay): String { - return when (day) { - TimetableDay.MON -> stringResource(R.string.word_mon) - TimetableDay.TUE -> stringResource(R.string.word_tue) - TimetableDay.WED -> stringResource(R.string.word_wed) - TimetableDay.THU -> stringResource(R.string.word_thu) - TimetableDay.FRI -> stringResource(R.string.word_fri) - TimetableDay.SAT -> stringResource(R.string.word_sat) - TimetableDay.E_LEARNING -> stringResource(R.string.word_elearning) - } -} - internal fun TimetableCell.getStartAndEndMinute(): Pair { val startMinute = (this.startPeriod + 8) * MINUTE60 + 3 * MINUTE10 val endMinute = (this.endPeriod + 9) * MINUTE60 + 2 * MINUTE10 @@ -41,25 +31,26 @@ internal fun Int.isNotOnTime(): Boolean { } @Composable -fun TimetableCellColumn( +internal fun ClassColumn( modifier: Modifier = Modifier, day: TimetableDay, cellList: List, lastPeriod: Int, + onClickClassCell: (TimetableCell) -> Unit = { _ -> }, ) { val sortedCellList = cellList.sortedBy { it.startPeriod } Column( modifier = modifier, ) { - TimetableEmptyCell( - text = timetableDayToString(day), + EmptyCell( + text = day.toText(), ) var prevEndTime = 9 * MINUTE60 sortedCellList.forEach { cell -> val (startMinute, endMinute) = cell.getStartAndEndMinute() FillEmptyTime(prevEndTime, startMinute) - TimetableClassCell(data = cell) + ClassCell(data = cell, onClick = onClickClassCell) prevEndTime = endMinute } @@ -89,7 +80,7 @@ fun FillEmptyTime(emptyStartTime: Int, emptyEndTime: Int) { } } - TimetableEmptyCell( + EmptyCell( minute = insertEmptyTimeAmount, ) @@ -108,14 +99,14 @@ fun TimetableCellColumnPreview() { Column( modifier = Modifier.weight(1f), ) { - TimetableEmptyCell(text = "") + EmptyCell(text = "") repeat(8) { - TimetableEmptyCell(text = "${it + 9}") + EmptyCell(text = "${it + 9}") } } repeat(5) { - TimetableCellColumn( + ClassColumn( modifier = Modifier.weight(1f), day = TimetableDay.FRI, cellList = listOf( diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/column/TimeColumn.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/column/TimeColumn.kt new file mode 100644 index 000000000..d74b9de32 --- /dev/null +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/column/TimeColumn.kt @@ -0,0 +1,22 @@ +package com.suwiki.core.designsystem.component.timetable.column + +import androidx.compose.foundation.layout.Column +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.suwiki.core.designsystem.component.timetable.cell.EmptyCell + +@Composable +internal fun TimeColumn( + modifier: Modifier = Modifier, + maxPeriod: Int, +) { + Column( + modifier = modifier, + ) { + EmptyCell() + + for (time in 1..maxPeriod) { + EmptyCell(text = "${time + 8}") + } + } +} diff --git a/core/designsystem/src/main/res/drawable/ic_timetable_add.xml b/core/designsystem/src/main/res/drawable/ic_timetable_add.xml new file mode 100644 index 000000000..c9a3fac85 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_timetable_add.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/designsystem/src/main/res/drawable/ic_timetable_hamburger.xml b/core/designsystem/src/main/res/drawable/ic_timetable_hamburger.xml new file mode 100644 index 000000000..e813ff417 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_timetable_hamburger.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/designsystem/src/main/res/drawable/ic_timetable_setting.xml b/core/designsystem/src/main/res/drawable/ic_timetable_setting.xml new file mode 100644 index 000000000..f88dca6f7 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_timetable_setting.xml @@ -0,0 +1,12 @@ + + + diff --git a/core/model/src/main/java/com/suwiki/core/model/timetable/Enums.kt b/core/model/src/main/java/com/suwiki/core/model/timetable/Enums.kt index 068d390b0..3aed648c6 100644 --- a/core/model/src/main/java/com/suwiki/core/model/timetable/Enums.kt +++ b/core/model/src/main/java/com/suwiki/core/model/timetable/Enums.kt @@ -23,6 +23,6 @@ enum class TimetableCellColor { VIOLET_LIGHT, } -enum class TimetableDay { - MON, TUE, WED, THU, FRI, SAT, E_LEARNING +enum class TimetableDay(val idx: Int) { + MON(0), TUE(1), WED(2), THU(3), FRI(4), SAT(5), E_LEARNING(6) } From c4a60112b023d968577354064fc0b2510552c410 Mon Sep 17 00:00:00 2001 From: jinukeu Date: Wed, 13 Dec 2023 18:13:34 +0900 Subject: [PATCH 15/18] =?UTF-8?q?refactor/#35:=20Timetable=20Component=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/timetable/Timetable.kt | 10 ++-- .../component/timetable/cell/ClassCell.kt | 46 +++++++++---------- .../component/timetable/cell/EmptyCell.kt | 3 ++ .../component/timetable/column/ClassColumn.kt | 4 +- 4 files changed, 35 insertions(+), 28 deletions(-) diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt index e16005bfe..cf1baae6c 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.suwiki.core.designsystem.R import com.suwiki.core.designsystem.component.timetable.cell.ELearningCell +import com.suwiki.core.designsystem.component.timetable.cell.TimetableCellType import com.suwiki.core.designsystem.component.timetable.column.TimeColumn import com.suwiki.core.designsystem.component.timetable.column.ClassColumn import com.suwiki.core.designsystem.theme.Black @@ -37,7 +38,7 @@ import com.suwiki.core.model.timetable.TimetableDay import com.suwiki.core.ui.extension.suwikiClickable import kotlin.math.max -internal const val MIN_MAX_PERIOD = 8 +private const val MIN_MAX_PERIOD = 8 internal fun List.maxPeriod(): Int { return max((maxOfOrNull { it.endPeriod }?.plus(1)) ?: MIN_MAX_PERIOD, MIN_MAX_PERIOD) @@ -46,6 +47,7 @@ internal fun List.maxPeriod(): Int { @Composable fun Timetable( modifier: Modifier = Modifier, + type: TimetableCellType = TimetableCellType.CLASSNAME_PROFESSOR_LOCATION, timetable: Timetable, onClickAdd: () -> Unit = {}, onClickHamburger: () -> Unit = {}, @@ -73,6 +75,7 @@ fun Timetable( Body( scrollState = scrollState, + type = type, maxPeriod = maxPeriod, cellGroupedByDay = cellGroupedByDay, onClickClassCell = onClickClassCell, @@ -120,7 +123,6 @@ private fun Header( Icon( modifier = Modifier.suwikiClickable(onClick = onClickSetting), - painter = painterResource(id = R.drawable.ic_timetable_setting), contentDescription = "", tint = Gray95, @@ -131,6 +133,7 @@ private fun Header( @Composable private fun Body( modifier: Modifier = Modifier, + type: TimetableCellType = TimetableCellType.CLASSNAME_PROFESSOR_LOCATION, scrollState: ScrollState, maxPeriod: Int, cellGroupedByDay: Map>, @@ -154,6 +157,7 @@ private fun Body( .forEach { day -> ClassColumn( modifier = Modifier.weight(1f), + type = type, day = day, cellList = cellGroupedByDay[day] ?: emptyList(), lastPeriod = maxPeriod, @@ -183,7 +187,7 @@ fun TimetablePreview() { createTime = 0L, year = "", semester = "", - name = "Previewaaaaaaaaaeeeeeaaaa", + name = "프리뷰입니다 프리뷰입니다 프리뷰입니다", cellList = listOf( TimetableCell( name = "도전과 창조", diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ClassCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ClassCell.kt index 58ff2de63..e85b8dd67 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ClassCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ClassCell.kt @@ -31,29 +31,27 @@ enum class TimetableCellType { CLASSNAME_PROFESSOR_LOCATION, } -internal fun timetableCellColorToHex(color: TimetableCellColor): Long { - return when (color) { - TimetableCellColor.BROWN -> 0xFFC28F62 - TimetableCellColor.LIGHT_BROWN -> 0xFFD4AC89 - TimetableCellColor.ORANGE -> 0xFFFFC152 - TimetableCellColor.APRICOT -> 0xFFFFC152 - TimetableCellColor.PURPLE -> 0xFF7E3348 - TimetableCellColor.PURPLE_LIGHT -> 0xFFC97189 - TimetableCellColor.RED_LIGHT -> 0xFFFE8888 - TimetableCellColor.PINK -> 0xFFFDA1E4 - TimetableCellColor.BROWN_DARK -> 0xFF614730 - TimetableCellColor.GREEN_DARK -> 0xFF96B277 - TimetableCellColor.GREEN -> 0xFFA5DC81 - TimetableCellColor.GREEN_LIGHT -> 0xFF99ECA5 - TimetableCellColor.NAVY_DARK -> 0xFF435796 - TimetableCellColor.NAVY -> 0xFF5772C1 - TimetableCellColor.NAVY_LIGHT -> 0xFF899DFE - TimetableCellColor.VIOLET -> 0xFFCC9AF3 - TimetableCellColor.GRAY_DARK -> 0xFF525252 - TimetableCellColor.GRAY -> 0xFFC2C1BD - TimetableCellColor.SKY -> 0xFF89C8FE - TimetableCellColor.VIOLET_LIGHT -> 0xFFC0C6E0 - } +private fun TimetableCellColor.toHex(): Long = when (this) { + TimetableCellColor.BROWN -> 0xFFC28F62 + TimetableCellColor.LIGHT_BROWN -> 0xFFD4AC89 + TimetableCellColor.ORANGE -> 0xFFFFC152 + TimetableCellColor.APRICOT -> 0xFFFFC152 + TimetableCellColor.PURPLE -> 0xFF7E3348 + TimetableCellColor.PURPLE_LIGHT -> 0xFFC97189 + TimetableCellColor.RED_LIGHT -> 0xFFFE8888 + TimetableCellColor.PINK -> 0xFFFDA1E4 + TimetableCellColor.BROWN_DARK -> 0xFF614730 + TimetableCellColor.GREEN_DARK -> 0xFF96B277 + TimetableCellColor.GREEN -> 0xFFA5DC81 + TimetableCellColor.GREEN_LIGHT -> 0xFF99ECA5 + TimetableCellColor.NAVY_DARK -> 0xFF435796 + TimetableCellColor.NAVY -> 0xFF5772C1 + TimetableCellColor.NAVY_LIGHT -> 0xFF899DFE + TimetableCellColor.VIOLET -> 0xFFCC9AF3 + TimetableCellColor.GRAY_DARK -> 0xFF525252 + TimetableCellColor.GRAY -> 0xFFC2C1BD + TimetableCellColor.SKY -> 0xFF89C8FE + TimetableCellColor.VIOLET_LIGHT -> 0xFFC0C6E0 } @Composable @@ -78,7 +76,7 @@ internal fun ClassCell( .height(height) .border(width = timetableBorderWidth, color = GrayF6) .padding(timetableBorderWidth) - .background(Color(timetableCellColorToHex(data.color))) + .background(Color(data.color.toHex())) .suwikiClickable { onClick(data) }, diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/EmptyCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/EmptyCell.kt index fca818da3..ca0dc385d 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/EmptyCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/EmptyCell.kt @@ -11,6 +11,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.suwiki.core.designsystem.component.timetable.MINUTE60 @@ -40,6 +41,8 @@ internal fun EmptyCell( if (text != null) { Text( text = text, + maxLines = 1, + overflow = TextOverflow.Ellipsis, style = SuwikiTheme.typography.caption4, color = Gray6A, ) diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/column/ClassColumn.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/column/ClassColumn.kt index 7a66847a5..f7ad6d41d 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/column/ClassColumn.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/column/ClassColumn.kt @@ -10,6 +10,7 @@ import com.suwiki.core.designsystem.component.timetable.MINUTE10 import com.suwiki.core.designsystem.component.timetable.MINUTE60 import com.suwiki.core.designsystem.component.timetable.cell.ClassCell import com.suwiki.core.designsystem.component.timetable.cell.EmptyCell +import com.suwiki.core.designsystem.component.timetable.cell.TimetableCellType import com.suwiki.core.designsystem.component.timetable.toText import com.suwiki.core.designsystem.theme.SuwikiTheme import com.suwiki.core.model.timetable.TimetableCell @@ -34,6 +35,7 @@ internal fun Int.isNotOnTime(): Boolean { internal fun ClassColumn( modifier: Modifier = Modifier, day: TimetableDay, + type: TimetableCellType = TimetableCellType.CLASSNAME_PROFESSOR_LOCATION, cellList: List, lastPeriod: Int, onClickClassCell: (TimetableCell) -> Unit = { _ -> }, @@ -50,7 +52,7 @@ internal fun ClassColumn( sortedCellList.forEach { cell -> val (startMinute, endMinute) = cell.getStartAndEndMinute() FillEmptyTime(prevEndTime, startMinute) - ClassCell(data = cell, onClick = onClickClassCell) + ClassCell(type = type, data = cell, onClick = onClickClassCell) prevEndTime = endMinute } From 5b98a3c7d64c2e1351b0b4eb329e8fbcdba8759d Mon Sep 17 00:00:00 2001 From: jinukeu Date: Wed, 13 Dec 2023 20:39:41 +0900 Subject: [PATCH 16/18] chore/#35: ktlint Format --- .../core/designsystem/component/timetable/Timetable.kt | 2 +- .../designsystem/component/timetable/cell/ELearningCell.kt | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt index cf1baae6c..5f2d78243 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt @@ -25,8 +25,8 @@ import androidx.compose.ui.unit.dp import com.suwiki.core.designsystem.R import com.suwiki.core.designsystem.component.timetable.cell.ELearningCell import com.suwiki.core.designsystem.component.timetable.cell.TimetableCellType -import com.suwiki.core.designsystem.component.timetable.column.TimeColumn import com.suwiki.core.designsystem.component.timetable.column.ClassColumn +import com.suwiki.core.designsystem.component.timetable.column.TimeColumn import com.suwiki.core.designsystem.theme.Black import com.suwiki.core.designsystem.theme.Gray95 import com.suwiki.core.designsystem.theme.GrayF6 diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ELearningCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ELearningCell.kt index b507f5385..bc861b10b 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ELearningCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ELearningCell.kt @@ -16,8 +16,11 @@ internal fun ELearningCell( val nameAndDay = "${cell.name} / ${cell.day.toText()}" val period = "(${cell.startPeriod} ~ ${cell.endPeriod})" - val text = if (cell.startPeriod != 0 && cell.endPeriod != 0) nameAndDay + period - else nameAndDay + val text = if (cell.startPeriod != 0 && cell.endPeriod != 0) { + nameAndDay + period + } else { + nameAndDay + } EmptyCell( modifier = modifier From a3025ceac7e96c0f8b746687a118fe903397f773 Mon Sep 17 00:00:00 2001 From: jinukeu Date: Wed, 13 Dec 2023 20:41:50 +0900 Subject: [PATCH 17/18] =?UTF-8?q?refactor/#35:=20TimetableCellColor.toHex(?= =?UTF-8?q?)=20=EB=A9=94=EC=84=9C=EB=93=9C=EC=9D=98Cyclomatic=20Complexity?= =?UTF-8?q?=2021=20->=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/timetable/cell/ClassCell.kt | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ClassCell.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ClassCell.kt index e85b8dd67..78000c752 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ClassCell.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/cell/ClassCell.kt @@ -31,28 +31,30 @@ enum class TimetableCellType { CLASSNAME_PROFESSOR_LOCATION, } -private fun TimetableCellColor.toHex(): Long = when (this) { - TimetableCellColor.BROWN -> 0xFFC28F62 - TimetableCellColor.LIGHT_BROWN -> 0xFFD4AC89 - TimetableCellColor.ORANGE -> 0xFFFFC152 - TimetableCellColor.APRICOT -> 0xFFFFC152 - TimetableCellColor.PURPLE -> 0xFF7E3348 - TimetableCellColor.PURPLE_LIGHT -> 0xFFC97189 - TimetableCellColor.RED_LIGHT -> 0xFFFE8888 - TimetableCellColor.PINK -> 0xFFFDA1E4 - TimetableCellColor.BROWN_DARK -> 0xFF614730 - TimetableCellColor.GREEN_DARK -> 0xFF96B277 - TimetableCellColor.GREEN -> 0xFFA5DC81 - TimetableCellColor.GREEN_LIGHT -> 0xFF99ECA5 - TimetableCellColor.NAVY_DARK -> 0xFF435796 - TimetableCellColor.NAVY -> 0xFF5772C1 - TimetableCellColor.NAVY_LIGHT -> 0xFF899DFE - TimetableCellColor.VIOLET -> 0xFFCC9AF3 - TimetableCellColor.GRAY_DARK -> 0xFF525252 - TimetableCellColor.GRAY -> 0xFFC2C1BD - TimetableCellColor.SKY -> 0xFF89C8FE - TimetableCellColor.VIOLET_LIGHT -> 0xFFC0C6E0 -} +private val colorHexMap = mapOf( + TimetableCellColor.BROWN to 0xFFC28F62, + TimetableCellColor.LIGHT_BROWN to 0xFFD4AC89, + TimetableCellColor.ORANGE to 0xFFFFC152, + TimetableCellColor.APRICOT to 0xFFFFC152, + TimetableCellColor.PURPLE to 0xFF7E3348, + TimetableCellColor.PURPLE_LIGHT to 0xFFC97189, + TimetableCellColor.RED_LIGHT to 0xFFFE8888, + TimetableCellColor.PINK to 0xFFFDA1E4, + TimetableCellColor.BROWN_DARK to 0xFF614730, + TimetableCellColor.GREEN_DARK to 0xFF96B277, + TimetableCellColor.GREEN to 0xFFA5DC81, + TimetableCellColor.GREEN_LIGHT to 0xFF99ECA5, + TimetableCellColor.NAVY_DARK to 0xFF435796, + TimetableCellColor.NAVY to 0xFF5772C1, + TimetableCellColor.NAVY_LIGHT to 0xFF899DFE, + TimetableCellColor.VIOLET to 0xFFCC9AF3, + TimetableCellColor.GRAY_DARK to 0xFF525252, + TimetableCellColor.GRAY to 0xFFC2C1BD, + TimetableCellColor.SKY to 0xFF89C8FE, + TimetableCellColor.VIOLET_LIGHT to 0xFFC0C6E0, +) + +private fun TimetableCellColor.toHex(): Long = colorHexMap[this]!! @Composable internal fun ClassCell( From 9e3916106d98992495766ed29e16d2714fac617a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=84=EC=9A=B1?= Date: Thu, 14 Dec 2023 15:47:21 +0900 Subject: [PATCH 18/18] =?UTF-8?q?docs/#35:=20Timetable.kt=20TODO=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../suwiki/core/designsystem/component/timetable/Timetable.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt index 5f2d78243..1e684a916 100644 --- a/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt +++ b/core/designsystem/src/main/java/com/suwiki/core/designsystem/component/timetable/Timetable.kt @@ -55,6 +55,8 @@ fun Timetable( onClickClassCell: (TimetableCell) -> Unit = { _ -> }, ) { val scrollState = rememberScrollState() + + // TODO 테스트 필요 val maxPeriod by remember { derivedStateOf { timetable.cellList.maxPeriod() } }