Move search to TopAppBar & Android fullscreen toggle in Settings

This commit is contained in:
Hasinjato 2026-06-16 15:20:26 +03:00
parent cbd0ccfd94
commit b4e9578d5e
5 changed files with 73 additions and 45 deletions

View file

@ -13,11 +13,13 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat
import mg.dot.feufaro.ui.LocalFullscreenController
import org.koin.androidx.compose.KoinAndroidContext import org.koin.androidx.compose.KoinAndroidContext
import java.io.File import java.io.File
import java.util.zip.GZIPInputStream import java.util.zip.GZIPInputStream
@ -37,16 +39,37 @@ class MainActivity : ComponentActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setFilePickerActivity(this) setFilePickerActivity(this)
WindowCompat.setDecorFitsSystemWindows(window, false) WindowCompat.setDecorFitsSystemWindows(window, false)
hideSystemBar()
intent?.let { handleDeepLinkIntent(it) } intent?.let { handleDeepLinkIntent(it) }
setContent { setContent {
KoinAndroidContext { KoinAndroidContext {
CompositionLocalProvider(
LocalFullscreenController provides { isFullScreen ->
updateSystemBarsVisibility(isFullScreen)
}
) {
App() App()
} }
} }
} }
}
fun updateSystemBarsVisibility(isFullScreen: Boolean) {
val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView)
if (isFullScreen) {
windowInsetsController.hide(WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.navigationBars())
windowInsetsController.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
window.attributes.layoutInDisplayCutoutMode =
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
}
} else {
windowInsetsController.show(WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.navigationBars())
}
}
@Suppress("OVERRIDE_DEPRECATION") @Suppress("OVERRIDE_DEPRECATION")
override fun onNewIntent(intent: Intent) { override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent) super.onNewIntent(intent)

View file

@ -3,42 +3,17 @@ package mg.dot.feufaro
import SharedScreenModel import SharedScreenModel
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.*
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.ime
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Edit import androidx.compose.material.icons.filled.Edit
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconToggleButton import androidx.compose.material3.IconToggleButton
import androidx.compose.material3.Switch
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.*
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
@ -50,9 +25,6 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Popup import androidx.compose.ui.window.Popup
import mg.dot.feufaro.solfa.LazyVerticalGridTUO
import mg.dot.feufaro.ui.MainScreenWithDrawer
import kotlin.math.roundToInt
import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.koin.koinScreenModel import cafe.adriel.voyager.koin.koinScreenModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -60,9 +32,12 @@ import kotlinx.coroutines.launch
import mg.dot.feufaro.data.GridTUOData import mg.dot.feufaro.data.GridTUOData
import mg.dot.feufaro.solfa.ColorPrefixB import mg.dot.feufaro.solfa.ColorPrefixB
import mg.dot.feufaro.solfa.EditSourceCompose import mg.dot.feufaro.solfa.EditSourceCompose
import mg.dot.feufaro.solfa.LazyVerticalGridTUO
import mg.dot.feufaro.ui.MainScreenWithDrawer
import mg.dot.feufaro.ui.MyVerticalScrollbar import mg.dot.feufaro.ui.MyVerticalScrollbar
import mg.dot.feufaro.viewmodel.SolfaScreenModel import mg.dot.feufaro.viewmodel.SolfaScreenModel
import java.io.ObjectStreamException import java.io.ObjectStreamException
import kotlin.math.roundToInt
object ScreenSolfa : Screen { object ScreenSolfa : Screen {
@Composable @Composable
@ -92,6 +67,7 @@ object ScreenSolfa : Screen {
} }
val tuoEditState by sharedScreenModel.tuoEditState.collectAsState() val tuoEditState by sharedScreenModel.tuoEditState.collectAsState()
val isFullScreenEnabled by sharedScreenModel.isFullScreen.collectAsState()
LaunchedEffect(tuoEditState) { LaunchedEffect(tuoEditState) {
tuoEditState?.let { state -> tuoEditState?.let { state ->
@ -116,11 +92,16 @@ object ScreenSolfa : Screen {
}, },
solfaScrollState = scrollState solfaScrollState = scrollState
) { paddingValues -> ) { paddingValues ->
val partitionInsets = if (isFullScreenEnabled) {
WindowInsets(0, 0, 0, 0)
} else {
WindowInsets.ime
}
Box( Box(
Modifier.fillMaxSize() Modifier.fillMaxSize()
.padding(paddingValues) .padding(paddingValues)
.windowInsetsPadding(WindowInsets.safeDrawing) .consumeWindowInsets(paddingValues)
.windowInsetsPadding(WindowInsets.ime) .windowInsetsPadding(partitionInsets)
.padding(horizontal = 16.dp) .padding(horizontal = 16.dp)
) { ) {
Column( Column(

View file

@ -20,19 +20,25 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import SharedScreenModel
import androidx.compose.material.icons.automirrored.filled.Undo
import mg.dot.feufaro.getPlatform
import mg.dot.feufaro.midi.Dynamic import mg.dot.feufaro.midi.Dynamic
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun Settings( fun Settings(
sharedScreenModel: SharedScreenModel,
onDismissRequest: () -> Unit onDismissRequest: () -> Unit
) { ) {
var isDynamicEnabled by remember { mutableStateOf(Dynamic.isGloballyEnabled) } var isDynamicEnabled by remember { mutableStateOf(Dynamic.isGloballyEnabled) }
var refreshTrigger by remember { mutableStateOf(0) } var refreshTrigger by remember { mutableStateOf(0) }
var expandedGeneral by remember { mutableStateOf(false) } var expandedGeneral by remember { mutableStateOf(true) }
var expandedPrint by remember { mutableStateOf(false) } var expandedPrint by remember { mutableStateOf(false) }
var expandedAudio by remember { mutableStateOf(true) } var expandedAudio by remember { mutableStateOf(false) }
val isFullScreenEnabled by sharedScreenModel.isFullScreen.collectAsState()
val platform = getPlatform()
val isAndroid = platform.name.startsWith("Android")
AlertDialog( AlertDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
title = { title = {
@ -60,12 +66,20 @@ fun Settings(
modifier = Modifier.padding(8.dp), modifier = Modifier.padding(8.dp),
verticalArrangement = Arrangement.spacedBy(10.dp) verticalArrangement = Arrangement.spacedBy(10.dp)
) { ) {
if(isAndroid) {
Row( Row(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween, horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
Text("Mode Plein Écran")
Switch(
checked = isFullScreenEnabled,
onCheckedChange = { isChecked ->
sharedScreenModel.toggleFullScreen(isChecked)
}
)
}
} }
} }
} }
@ -128,7 +142,11 @@ fun Settings(
), ),
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp) contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp)
) { ) {
Text("Réinitialiser", fontSize = 14.sp) Icon(
imageVector = Icons.AutoMirrored.Default.Undo,
contentDescription = null,
tint = Color.Red
)
} }
} }
} }

View file

@ -58,7 +58,7 @@ fun SimpleDrawerContent(
val playList by sharedScreenModel.playlistItems.collectAsState() val playList by sharedScreenModel.playlistItems.collectAsState()
val listState = rememberLazyListState() val listState = rememberLazyListState()
var internalExpanded by remember { mutableStateOf(true) } var internalExpanded by remember { mutableStateOf(false) }
var externalExpanded by remember { mutableStateOf(false) } var externalExpanded by remember { mutableStateOf(false) }
var playListExpanded by remember { mutableStateOf(false) } var playListExpanded by remember { mutableStateOf(false) }

View file

@ -226,6 +226,12 @@ class SharedScreenModel(private val fileRepository: FileRepository) : ScreenMode
fun toggleEditorMode(enabled: Boolean) { fun toggleEditorMode(enabled: Boolean) {
_modeEditor.value = enabled _modeEditor.value = enabled
} }
private val _isFullScreen = MutableStateFlow(false)
val isFullScreen = _isFullScreen.asStateFlow()
fun toggleFullScreen(enabled: Boolean) {
_isFullScreen.value = enabled
}
val transpositionInterval = MutableStateFlow(0) val transpositionInterval = MutableStateFlow(0)
fun setTranspositionInterval(interval: Int) { fun setTranspositionInterval(interval: Int) {