From a46d74c20a2e38415fd24b644f4a6bbbce189c29 Mon Sep 17 00:00:00 2001 From: izzy2lost Date: Thu, 23 Oct 2025 20:17:23 -0400 Subject: [PATCH] change theme colors some more --- .../java/com/izzy2lost/weeu/MainActivity.kt | 37 ++++-- .../izzy2lost/weeu/common/ui/theme/Theme.kt | 59 +++++---- .../weeu/gamelist/GameListNavigation.kt | 14 +- .../weeu/gamelist/GamesListScreen.kt | 120 ++++++++++++++++++ .../weeu/settings/SettingsNavigation.kt | 91 +++++++++++-- src/android/gradle/libs.versions.toml | 2 +- src/config/CemuConfig.cpp | 2 +- 7 files changed, 272 insertions(+), 53 deletions(-) diff --git a/src/android/app/src/main/java/com/izzy2lost/weeu/MainActivity.kt b/src/android/app/src/main/java/com/izzy2lost/weeu/MainActivity.kt index 7dc5184e..6ae506af 100644 --- a/src/android/app/src/main/java/com/izzy2lost/weeu/MainActivity.kt +++ b/src/android/app/src/main/java/com/izzy2lost/weeu/MainActivity.kt @@ -15,8 +15,10 @@ import androidx.compose.animation.ExitTransition import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Text @@ -46,6 +48,12 @@ import com.izzy2lost.weeu.nativeinterface.NativeActiveSettings import com.izzy2lost.weeu.nativeinterface.NativeGameTitles.Game import com.izzy2lost.weeu.nativeinterface.NativeSettings import com.izzy2lost.weeu.provider.DocumentsProvider +import com.izzy2lost.weeu.settings.AccountSettingsRoute +import com.izzy2lost.weeu.settings.AudioSettingsRoute +import com.izzy2lost.weeu.settings.GeneralSettingsRoute +import com.izzy2lost.weeu.settings.GraphicsSettingsRoute +import com.izzy2lost.weeu.settings.InputSettingsRoute +import com.izzy2lost.weeu.settings.OverlaySettingsRoute import com.izzy2lost.weeu.settings.SettingsRoute import com.izzy2lost.weeu.settings.settingsNavigation import com.izzy2lost.weeu.titlemanager.TitleManagerRoute @@ -92,15 +100,21 @@ private fun MainNav() { gameListNavigation( navController = navController, startGame = { startGame(context, it) }, - createShortcut = { createShortcutForGame(context, it) } - ) { - GameListToolBarActionsMenu( - goToSettings = { navController.navigate(SettingsRoute) }, - goToTitleManager = { navController.navigate(TitleManagerRoute) }, - goToGraphicPacks = { navController.navigate(GraphicPacksRoute) }, - goToAboutCemu = { navController.navigate(AboutCemuRoute) } - ) - } + createShortcut = { createShortcutForGame(context, it) }, + gameListToolBarActions = { + GameListToolBarActionsMenu( + goToTitleManager = { navController.navigate(TitleManagerRoute) }, + goToGraphicPacks = { navController.navigate(GraphicPacksRoute) }, + goToAboutCemu = { navController.navigate(AboutCemuRoute) } + ) + }, + goToGeneralSettings = { navController.navigate(GeneralSettingsRoute) }, + goToInputSettings = { navController.navigate(InputSettingsRoute) }, + goToGraphicsSettings = { navController.navigate(GraphicsSettingsRoute) }, + goToAudioSettings = { navController.navigate(AudioSettingsRoute) }, + goToOverlaySettings = { navController.navigate(OverlaySettingsRoute) }, + goToAccountSettings = { navController.navigate(AccountSettingsRoute) } + ) settingsNavigation(navController) titleManagerNavigation(navController) graphicPacksNavigation(navController) @@ -110,7 +124,6 @@ private fun MainNav() { @Composable private fun GameListToolBarActionsMenu( - goToSettings: () -> Unit, goToTitleManager: () -> Unit, goToGraphicPacks: () -> Unit, goToAboutCemu: () -> Unit, @@ -141,10 +154,6 @@ private fun GameListToolBarActionsMenu( expanded = expandMenu, onDismissRequest = { expandMenu = false } ) { - DropdownMenuItem( - onClick = goToSettings, - text = tr("Settings") - ) DropdownMenuItem( onClick = goToGraphicPacks, text = tr("Graphic packs") diff --git a/src/android/app/src/main/java/com/izzy2lost/weeu/common/ui/theme/Theme.kt b/src/android/app/src/main/java/com/izzy2lost/weeu/common/ui/theme/Theme.kt index 55e074c8..f4bf2181 100644 --- a/src/android/app/src/main/java/com/izzy2lost/weeu/common/ui/theme/Theme.kt +++ b/src/android/app/src/main/java/com/izzy2lost/weeu/common/ui/theme/Theme.kt @@ -18,41 +18,50 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -// Wee U brand color +// Wee U brand colors private val WeeUCyan = Color(0xFF009ac7) -private val WeeUCyanLight = Color(0xFF33b0d5) -private val WeeUCyanDark = Color(0xFF007a9f) +private val WeeUGray = Color(0xFF8b8b8b) +private val WeeUWhite = Color(0xFFFFFFFF) +private val WeeUBlack = Color(0xFF000000) -// Dark theme with cyan background and accents +// Dark theme - black background with cyan and gray accents private val DarkColorScheme = darkColorScheme( primary = WeeUCyan, - onPrimary = Color.White, - primaryContainer = WeeUCyanDark, - onPrimaryContainer = Color.White, - secondary = WeeUCyanLight, - onSecondary = Color.White, - background = WeeUCyan, - onBackground = Color.White, - surface = WeeUCyan, - onSurface = Color.White, - surfaceVariant = WeeUCyanDark, - onSurfaceVariant = Color.White, + onPrimary = WeeUBlack, + primaryContainer = WeeUCyan, + onPrimaryContainer = WeeUBlack, + secondary = WeeUGray, + onSecondary = WeeUBlack, + tertiary = WeeUCyan, + onTertiary = WeeUBlack, + background = WeeUBlack, + onBackground = WeeUWhite, + surface = Color(0xFF1A1A1A), + onSurface = WeeUWhite, + surfaceVariant = Color(0xFF2A2A2A), + onSurfaceVariant = WeeUGray, + outline = WeeUGray, + outlineVariant = Color(0xFF3A3A3A), ) -// Light theme with cyan text and accents +// Light theme - white background with cyan and gray accents private val LightColorScheme = lightColorScheme( primary = WeeUCyan, - onPrimary = Color.White, - primaryContainer = WeeUCyanLight, + onPrimary = WeeUWhite, + primaryContainer = Color(0xFFE0F7FF), onPrimaryContainer = WeeUCyan, - secondary = WeeUCyanDark, - onSecondary = Color.White, - background = Color.White, - onBackground = WeeUCyan, - surface = Color.White, - onSurface = WeeUCyan, + secondary = WeeUGray, + onSecondary = WeeUWhite, + tertiary = WeeUCyan, + onTertiary = WeeUWhite, + background = WeeUWhite, + onBackground = WeeUBlack, + surface = WeeUWhite, + onSurface = WeeUBlack, surfaceVariant = Color(0xFFF5F5F5), - onSurfaceVariant = WeeUCyan, + onSurfaceVariant = WeeUGray, + outline = WeeUGray, + outlineVariant = Color(0xFFE0E0E0), ) /** diff --git a/src/android/app/src/main/java/com/izzy2lost/weeu/gamelist/GameListNavigation.kt b/src/android/app/src/main/java/com/izzy2lost/weeu/gamelist/GameListNavigation.kt index 1a0a455a..56fdb050 100644 --- a/src/android/app/src/main/java/com/izzy2lost/weeu/gamelist/GameListNavigation.kt +++ b/src/android/app/src/main/java/com/izzy2lost/weeu/gamelist/GameListNavigation.kt @@ -44,6 +44,12 @@ fun NavGraphBuilder.gameListNavigation( startGame: (NativeGameTitles.Game) -> Unit, createShortcut: (NativeGameTitles.Game) -> Unit, gameListToolBarActions: @Composable (RowScope.() -> Unit), + goToGeneralSettings: () -> Unit, + goToInputSettings: () -> Unit, + goToGraphicsSettings: () -> Unit, + goToAudioSettings: () -> Unit, + goToOverlaySettings: () -> Unit, + goToAccountSettings: () -> Unit, ) { navigation(startDestination = GameListRoutes.GamesRoute) { composable { backStackEntry -> @@ -59,7 +65,13 @@ fun NavGraphBuilder.gameListNavigation( gameViewModel.game = game navController.navigate(GameListRoutes.GameDetailsRoute) }, - toolbarActions = gameListToolBarActions + toolbarActions = gameListToolBarActions, + goToGeneralSettings = goToGeneralSettings, + goToInputSettings = goToInputSettings, + goToGraphicsSettings = goToGraphicsSettings, + goToAudioSettings = goToAudioSettings, + goToOverlaySettings = goToOverlaySettings, + goToAccountSettings = goToAccountSettings ) } composableGameScreen(navController) { game -> diff --git a/src/android/app/src/main/java/com/izzy2lost/weeu/gamelist/GamesListScreen.kt b/src/android/app/src/main/java/com/izzy2lost/weeu/gamelist/GamesListScreen.kt index d8cfe54a..c36258b2 100644 --- a/src/android/app/src/main/java/com/izzy2lost/weeu/gamelist/GamesListScreen.kt +++ b/src/android/app/src/main/java/com/izzy2lost/weeu/gamelist/GamesListScreen.kt @@ -1,14 +1,19 @@ @file:OptIn( ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class, + ExperimentalMaterial3ExpressiveApi::class, ) package com.izzy2lost.weeu.gamelist import androidx.activity.compose.BackHandler import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.foundation.background import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxSize @@ -19,14 +24,27 @@ import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.AccountCircle +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Gamepad +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.GraphicEq +import androidx.compose.material.icons.filled.Headphones +import androidx.compose.material.icons.filled.Layers +import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.AlertDialog import androidx.compose.material3.Checkbox import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButtonMenu +import androidx.compose.material3.FloatingActionButtonMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold +import androidx.compose.material3.ToggleFloatingActionButton +import androidx.compose.material3.ToggleFloatingActionButtonDefaults import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text @@ -38,6 +56,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -47,6 +66,8 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp @@ -71,6 +92,12 @@ fun GamesListScreen( startGame: (Game) -> Unit, createShortcut: (Game) -> Unit, toolbarActions: @Composable RowScope.() -> Unit, + goToGeneralSettings: () -> Unit, + goToInputSettings: () -> Unit, + goToGraphicsSettings: () -> Unit, + goToAudioSettings: () -> Unit, + goToOverlaySettings: () -> Unit, + goToAccountSettings: () -> Unit, ) { val lifecycleOwner = LocalLifecycleOwner.current val lifecycleState by lifecycleOwner.lifecycle.currentStateFlow.collectAsState() @@ -79,9 +106,12 @@ fun GamesListScreen( val snackbarHostState = remember { SnackbarHostState() } val gameSearchQuery by gameListViewModel.filterText.collectAsStateWithLifecycle() val games by gameListViewModel.games.collectAsStateWithLifecycle() + var fabExpanded by rememberSaveable { mutableStateOf(false) } val state = rememberPullToRefreshState() + BackHandler(fabExpanded) { fabExpanded = false } + LaunchedEffect(lifecycleState) { if (lifecycleState == Lifecycle.State.RESUMED && gameListViewModel.gamePathsHaveChanged()) gameListViewModel.refreshGames() @@ -103,6 +133,18 @@ fun GamesListScreen( onValueChange = gameListViewModel::setFilterText ) }, + floatingActionButton = { + SettingsFabMenu( + expanded = fabExpanded, + onExpandChange = { fabExpanded = it }, + goToGeneralSettings = goToGeneralSettings, + goToInputSettings = goToInputSettings, + goToGraphicsSettings = goToGraphicsSettings, + goToAudioSettings = goToAudioSettings, + goToOverlaySettings = goToOverlaySettings, + goToAccountSettings = goToAccountSettings + ) + } ) { scaffoldPadding -> Box( modifier = Modifier @@ -290,6 +332,84 @@ private fun GameListItem( } } +@Composable +private fun SettingsFabMenu( + expanded: Boolean, + onExpandChange: (Boolean) -> Unit, + goToGeneralSettings: () -> Unit, + goToInputSettings: () -> Unit, + goToGraphicsSettings: () -> Unit, + goToAudioSettings: () -> Unit, + goToOverlaySettings: () -> Unit, + goToAccountSettings: () -> Unit, +) { + FloatingActionButtonMenu( + expanded = expanded, + button = { + ToggleFloatingActionButton( + checked = expanded, + onCheckedChange = { onExpandChange(!expanded) } + ) { + Icon( + imageVector = if (expanded) Icons.Filled.Close else Icons.Filled.Settings, + contentDescription = tr("Settings") + ) + } + } + ) { + val textColor = if (isSystemInDarkTheme()) Color.White else Color.Black + + FloatingActionButtonMenuItem( + onClick = { + goToGeneralSettings() + onExpandChange(false) + }, + icon = { Icon(Icons.Filled.Settings, contentDescription = null, tint = textColor) }, + text = { Text(tr("General"), color = textColor) } + ) + FloatingActionButtonMenuItem( + onClick = { + goToInputSettings() + onExpandChange(false) + }, + icon = { Icon(Icons.Filled.Gamepad, contentDescription = null, tint = textColor) }, + text = { Text(tr("Input"), color = textColor) } + ) + FloatingActionButtonMenuItem( + onClick = { + goToGraphicsSettings() + onExpandChange(false) + }, + icon = { Icon(Icons.Filled.GraphicEq, contentDescription = null, tint = textColor) }, + text = { Text(tr("Graphics"), color = textColor) } + ) + FloatingActionButtonMenuItem( + onClick = { + goToAudioSettings() + onExpandChange(false) + }, + icon = { Icon(Icons.Filled.Headphones, contentDescription = null, tint = textColor) }, + text = { Text(tr("Audio"), color = textColor) } + ) + FloatingActionButtonMenuItem( + onClick = { + goToOverlaySettings() + onExpandChange(false) + }, + icon = { Icon(Icons.Filled.Layers, contentDescription = null, tint = textColor) }, + text = { Text(tr("Overlay"), color = textColor) } + ) + FloatingActionButtonMenuItem( + onClick = { + goToAccountSettings() + onExpandChange(false) + }, + icon = { Icon(Icons.Filled.AccountCircle, contentDescription = null, tint = textColor) }, + text = { Text(tr("Account"), color = textColor) } + ) + } +} + @Composable private fun GameContextMenu( expanded: Boolean, diff --git a/src/android/app/src/main/java/com/izzy2lost/weeu/settings/SettingsNavigation.kt b/src/android/app/src/main/java/com/izzy2lost/weeu/settings/SettingsNavigation.kt index faf41608..a924c7f1 100644 --- a/src/android/app/src/main/java/com/izzy2lost/weeu/settings/SettingsNavigation.kt +++ b/src/android/app/src/main/java/com/izzy2lost/weeu/settings/SettingsNavigation.kt @@ -21,6 +21,24 @@ import kotlinx.serialization.Serializable @Serializable object SettingsRoute +@Serializable +object GeneralSettingsRoute + +@Serializable +object InputSettingsRoute + +@Serializable +object AudioSettingsRoute + +@Serializable +object GraphicsSettingsRoute + +@Serializable +object OverlaySettingsRoute + +@Serializable +object AccountSettingsRoute + private object SettingsRoutes { @Serializable object GeneralSettings @@ -29,7 +47,10 @@ private object SettingsRoutes { object GeneralSettingsScreenRoute @Serializable - object InputSettingsRoute + object InputSettingsRouteInternal + + @Serializable + object InputSettingsScreenRoute @Serializable object SettingsHomeScreenRoute @@ -49,9 +70,6 @@ private object SettingsRoutes { @Serializable object OverlaySettingsScreenRoute - @Serializable - object InputSettingsScreenRoute - @Serializable data class ControllerInputSettingsScreenRoute(val index: Int) @@ -68,20 +86,33 @@ fun NavGraphBuilder.settingsNavigation(navController: NavHostController) { SettingsHomeScreen( navigateBack = { navController.popBackStack() }, actions = SettingsHomeScreenActions( - goToGeneralSettings = { navController.navigate(SettingsRoutes.GeneralSettings) }, - goToInputSettings = { navController.navigate(SettingsRoutes.InputSettingsRoute) }, - goToGraphicsSettings = { navController.navigate(SettingsRoutes.GraphicsSettingsScreenRoute) }, - goToAudioSettings = { navController.navigate(SettingsRoutes.AudioSettingsScreenRoute) }, - goToOverlaySettings = { navController.navigate(SettingsRoutes.OverlaySettingsScreenRoute) }, - goToAccountSettings = { navController.navigate(SettingsRoutes.AccountSettingsScreenRoute) } + goToGeneralSettings = { navController.navigate(GeneralSettingsRoute) }, + goToInputSettings = { navController.navigate(InputSettingsRoute) }, + goToGraphicsSettings = { navController.navigate(GraphicsSettingsRoute) }, + goToAudioSettings = { navController.navigate(AudioSettingsRoute) }, + goToOverlaySettings = { navController.navigate(OverlaySettingsRoute) }, + goToAccountSettings = { navController.navigate(AccountSettingsRoute) } ) ) } + composable { + AudioSettingsScreen( + navigateBack = { navController.popBackStack() }, + ) + } composable { AudioSettingsScreen( navigateBack = { navController.popBackStack() }, ) } + composable { + GraphicsSettingsScreen( + navigateBack = { navController.popBackStack() }, + goToCustomDriversSettings = { + navController.navigate(SettingsRoutes.CustomDriversScreenRoute) + } + ) + } composable { GraphicsSettingsScreen( navigateBack = { navController.popBackStack() }, @@ -95,12 +126,39 @@ fun NavGraphBuilder.settingsNavigation(navController: NavHostController) { navigateBack = { navController.popBackStack() }, ) } + composable { + OverlaySettingsScreen( + navigateBack = { navController.popBackStack() }, + ) + } composable { OverlaySettingsScreen( navigateBack = { navController.popBackStack() }, ) } - navigation(startDestination = SettingsRoutes.InputSettingsScreenRoute) { + composable { + AccountSettingsScreen( + navigateBack = { navController.popBackStack() }, + ) + } + composable { + InputSettingsScreen( + navigateBack = { navController.popBackStack() }, + actions = InputSettingsScreenActions( + goToInputOverlaySettings = { + navController.navigate(SettingsRoutes.InputOverlaySettingsScreenRoute) + }, + goToControllerSettings = { controllerIndex -> + navController.navigate( + SettingsRoutes.ControllerInputSettingsScreenRoute( + controllerIndex + ) + ) + }, + ) + ) + } + navigation(startDestination = SettingsRoutes.InputSettingsScreenRoute) { composable { navBackStackEntry -> val controllerIndex = navBackStackEntry.toRoute().index @@ -132,6 +190,12 @@ fun NavGraphBuilder.settingsNavigation(navController: NavHostController) { ) } } + composable { + GeneralSettingsScreen( + navigateBack = { navController.popBackStack() }, + goToGamePathsSettings = { navController.navigate(SettingsRoutes.GamePathsScreenRoute) } + ) + } navigation(startDestination = SettingsRoutes.GeneralSettingsScreenRoute) { composable { GeneralSettingsScreen( @@ -151,5 +215,10 @@ fun NavGraphBuilder.settingsNavigation(navController: NavHostController) { navigateBack = { navController.popBackStack() }, ) } + composable { + AccountSettingsScreen( + navigateBack = { navController.popBackStack() }, + ) + } } } \ No newline at end of file diff --git a/src/android/gradle/libs.versions.toml b/src/android/gradle/libs.versions.toml index 90693dc5..e083d429 100644 --- a/src/android/gradle/libs.versions.toml +++ b/src/android/gradle/libs.versions.toml @@ -7,7 +7,7 @@ kotlin = "2.2.10" androidx-core-ktx = "1.17.0" androidx-activity-compose = "1.10.1" androidx-compose-bom = "2025.08.00" -androidx-compose-material3 = "1.4.0-beta01" +androidx-compose-material3 = "1.4.0-alpha01" androidx-compose-material3-adaptive = "1.1.0" google-android-material = "1.12.0" androidx-navigation-compose = "2.9.3" diff --git a/src/config/CemuConfig.cpp b/src/config/CemuConfig.cpp index ae707e04..70957f60 100644 --- a/src/config/CemuConfig.cpp +++ b/src/config/CemuConfig.cpp @@ -178,7 +178,7 @@ XMLConfigParser CemuConfig::Load(XMLConfigParser& parser) notification.text_scale = notification_node.get("TextScale", 100); notification.controller_profiles = notification_node.get("ControllerProfiles", true); notification.controller_battery = notification_node.get("ControllerBattery", false); - notification.shader_compiling = notification_node.get("ShaderCompiling", true); + notification.shader_compiling = notification_node.get("ShaderCompiling", false); notification.friends = notification_node.get("FriendService", true); }