feat(ui): initial impl of guilds in channel browser
This commit is contained in:
parent
30c1ba5780
commit
83f13d4b5c
1 changed files with 104 additions and 80 deletions
|
|
@ -19,6 +19,7 @@ import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.ListItemDefaults
|
import androidx.compose.material3.ListItemDefaults
|
||||||
import androidx.compose.material3.MaterialExpressiveTheme
|
import androidx.compose.material3.MaterialExpressiveTheme
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.MotionScheme
|
||||||
import androidx.compose.material3.SegmentedListItem
|
import androidx.compose.material3.SegmentedListItem
|
||||||
import androidx.compose.material3.SheetValue
|
import androidx.compose.material3.SheetValue
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
|
|
@ -33,7 +34,8 @@ import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.tooling.preview.PreviewScreenSizes
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import moe.lava.neon.resources.Res
|
import moe.lava.neon.resources.Res
|
||||||
import moe.lava.neon.resources.arrow_drop_down
|
import moe.lava.neon.resources.arrow_drop_down
|
||||||
|
|
@ -43,6 +45,7 @@ import moe.lava.neon.resources.volume_up
|
||||||
import org.jetbrains.compose.resources.painterResource
|
import org.jetbrains.compose.resources.painterResource
|
||||||
|
|
||||||
data class ChannelBrowserModel(
|
data class ChannelBrowserModel(
|
||||||
|
val guildPosition: GuildPosition,
|
||||||
val guildName: String,
|
val guildName: String,
|
||||||
val channels: List<Category>,
|
val channels: List<Category>,
|
||||||
) {
|
) {
|
||||||
|
|
@ -58,6 +61,10 @@ data class ChannelBrowserModel(
|
||||||
Text,
|
Text,
|
||||||
Voice
|
Voice
|
||||||
}
|
}
|
||||||
|
enum class GuildPosition {
|
||||||
|
LeftSidebar,
|
||||||
|
BottomSheet
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class)
|
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class)
|
||||||
|
|
@ -155,93 +162,110 @@ fun ChannelBrowser(
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
|
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
|
||||||
@PreviewScreenSizes
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
internal fun ChannelBrowserPreview() {
|
internal fun ChannelBrowserPreview(
|
||||||
MaterialExpressiveTheme {
|
@PreviewParameter(ChannelBrowserPreviewProvider::class) model: ChannelBrowserModel
|
||||||
ChannelBrowser(
|
) {
|
||||||
ChannelBrowserModel(
|
MaterialExpressiveTheme(
|
||||||
guildName = "My Awesome Guild",
|
// This will break live previews
|
||||||
|
// colorScheme = getColorScheme(),
|
||||||
|
motionScheme = MotionScheme.expressive(),
|
||||||
|
) {
|
||||||
|
ChannelBrowser(model)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class ChannelBrowserPreviewProvider : PreviewParameterProvider<ChannelBrowserModel> {
|
||||||
|
private val base = ChannelBrowserModel(
|
||||||
|
guildPosition = ChannelBrowserModel.GuildPosition.BottomSheet,
|
||||||
|
guildName = "My Awesome Guild",
|
||||||
|
channels = listOf(
|
||||||
|
ChannelBrowserModel.Category(
|
||||||
|
name = "Text Channels",
|
||||||
channels = listOf(
|
channels = listOf(
|
||||||
ChannelBrowserModel.Category(
|
ChannelBrowserModel.Channel(
|
||||||
name = "Text Channels",
|
"general",
|
||||||
channels = listOf(
|
ChannelBrowserModel.ChannelType.Text
|
||||||
ChannelBrowserModel.Channel(
|
|
||||||
"general",
|
|
||||||
ChannelBrowserModel.ChannelType.Text
|
|
||||||
),
|
|
||||||
ChannelBrowserModel.Channel(
|
|
||||||
"random",
|
|
||||||
ChannelBrowserModel.ChannelType.Text
|
|
||||||
),
|
|
||||||
ChannelBrowserModel.Channel(
|
|
||||||
"music-discussion",
|
|
||||||
ChannelBrowserModel.ChannelType.Text
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
),
|
||||||
ChannelBrowserModel.Category(
|
ChannelBrowserModel.Channel(
|
||||||
name = "Voice Channels",
|
"random",
|
||||||
channels = listOf(
|
ChannelBrowserModel.ChannelType.Text
|
||||||
ChannelBrowserModel.Channel(
|
|
||||||
"General",
|
|
||||||
ChannelBrowserModel.ChannelType.Voice
|
|
||||||
),
|
|
||||||
ChannelBrowserModel.Channel(
|
|
||||||
"Gaming",
|
|
||||||
ChannelBrowserModel.ChannelType.Voice
|
|
||||||
),
|
|
||||||
ChannelBrowserModel.Channel(
|
|
||||||
"dev-voice",
|
|
||||||
ChannelBrowserModel.ChannelType.Voice
|
|
||||||
),
|
|
||||||
ChannelBrowserModel.Channel(
|
|
||||||
"chill",
|
|
||||||
ChannelBrowserModel.ChannelType.Voice
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
),
|
||||||
ChannelBrowserModel.Category(
|
ChannelBrowserModel.Channel(
|
||||||
name = "Development",
|
"music-discussion",
|
||||||
channels = listOf(
|
ChannelBrowserModel.ChannelType.Text
|
||||||
ChannelBrowserModel.Channel(
|
)
|
||||||
"neon",
|
)
|
||||||
ChannelBrowserModel.ChannelType.Text
|
),
|
||||||
),
|
ChannelBrowserModel.Category(
|
||||||
ChannelBrowserModel.Channel(
|
name = "Voice Channels",
|
||||||
"compose",
|
channels = listOf(
|
||||||
ChannelBrowserModel.ChannelType.Text
|
ChannelBrowserModel.Channel(
|
||||||
),
|
"General",
|
||||||
ChannelBrowserModel.Channel(
|
ChannelBrowserModel.ChannelType.Voice
|
||||||
"dev-voice-chat",
|
|
||||||
ChannelBrowserModel.ChannelType.Voice
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
),
|
||||||
ChannelBrowserModel.Category(
|
ChannelBrowserModel.Channel(
|
||||||
name = "Off-topic",
|
"Gaming",
|
||||||
channels = listOf(
|
ChannelBrowserModel.ChannelType.Voice
|
||||||
ChannelBrowserModel.Channel(
|
),
|
||||||
"memes",
|
ChannelBrowserModel.Channel(
|
||||||
ChannelBrowserModel.ChannelType.Text
|
"dev-voice",
|
||||||
),
|
ChannelBrowserModel.ChannelType.Voice
|
||||||
ChannelBrowserModel.Channel(
|
),
|
||||||
"music",
|
ChannelBrowserModel.Channel(
|
||||||
ChannelBrowserModel.ChannelType.Voice
|
"chill",
|
||||||
),
|
ChannelBrowserModel.ChannelType.Voice
|
||||||
ChannelBrowserModel.Channel(
|
)
|
||||||
"anime",
|
)
|
||||||
ChannelBrowserModel.ChannelType.Text
|
),
|
||||||
),
|
ChannelBrowserModel.Category(
|
||||||
ChannelBrowserModel.Channel(
|
name = "Development",
|
||||||
"gaming-chat",
|
channels = listOf(
|
||||||
ChannelBrowserModel.ChannelType.Text
|
ChannelBrowserModel.Channel(
|
||||||
)
|
"neon",
|
||||||
)
|
ChannelBrowserModel.ChannelType.Text
|
||||||
|
),
|
||||||
|
ChannelBrowserModel.Channel(
|
||||||
|
"compose",
|
||||||
|
ChannelBrowserModel.ChannelType.Text
|
||||||
|
),
|
||||||
|
ChannelBrowserModel.Channel(
|
||||||
|
"dev-voice-chat",
|
||||||
|
ChannelBrowserModel.ChannelType.Voice
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
ChannelBrowserModel.Category(
|
||||||
|
name = "Off-topic",
|
||||||
|
channels = listOf(
|
||||||
|
ChannelBrowserModel.Channel(
|
||||||
|
"memes",
|
||||||
|
ChannelBrowserModel.ChannelType.Text
|
||||||
|
),
|
||||||
|
ChannelBrowserModel.Channel(
|
||||||
|
"music",
|
||||||
|
ChannelBrowserModel.ChannelType.Voice
|
||||||
|
),
|
||||||
|
ChannelBrowserModel.Channel(
|
||||||
|
"anime",
|
||||||
|
ChannelBrowserModel.ChannelType.Text
|
||||||
|
),
|
||||||
|
ChannelBrowserModel.Channel(
|
||||||
|
"gaming-chat",
|
||||||
|
ChannelBrowserModel.ChannelType.Text
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
)
|
||||||
|
|
||||||
|
private val models = listOf(
|
||||||
|
base.copy(guildPosition = ChannelBrowserModel.GuildPosition.BottomSheet),
|
||||||
|
base.copy(guildPosition = ChannelBrowserModel.GuildPosition.LeftSidebar),
|
||||||
|
)
|
||||||
|
override val values: Sequence<ChannelBrowserModel> = models.asSequence()
|
||||||
|
|
||||||
|
override fun getDisplayName(index: Int): String =
|
||||||
|
models[index].guildPosition.toString()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue