Skip to content

Commit cece5b0

Browse files
committed
feat: add settings menu for pixel perfect rendering and fullscreen button
1 parent 7452876 commit cece5b0

File tree

2 files changed

+53
-9
lines changed

2 files changed

+53
-9
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ kotlinx-serialization = "1.8.0"
66
kotlinx-datetime = "0.6.1"
77

88
compose = "1.7.3"
9-
compose-gl = "0.7.2"
9+
compose-gl = "0.7.3"
1010
jni-utils = "0.1.6"
1111
skiko = "0.8.19-egl"
1212
jna = "5.16.0"

src/main/kotlin/dev/silenium/multimedia/compose/player/VideoPlayerControls.kt

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,9 @@ import androidx.compose.foundation.clickable
99
import androidx.compose.foundation.focusable
1010
import androidx.compose.foundation.interaction.MutableInteractionSource
1111
import androidx.compose.foundation.layout.*
12-
import androidx.compose.material.CircularProgressIndicator
13-
import androidx.compose.material.Icon
14-
import androidx.compose.material.IconButton
15-
import androidx.compose.material.MaterialTheme
12+
import androidx.compose.material.*
1613
import androidx.compose.material.icons.Icons
17-
import androidx.compose.material.icons.filled.FastForward
18-
import androidx.compose.material.icons.filled.FastRewind
19-
import androidx.compose.material.icons.filled.Pause
20-
import androidx.compose.material.icons.filled.PlayArrow
14+
import androidx.compose.material.icons.filled.*
2115
import androidx.compose.runtime.*
2216
import androidx.compose.ui.Alignment
2317
import androidx.compose.ui.Modifier
@@ -28,6 +22,7 @@ import androidx.compose.ui.geometry.Offset
2822
import androidx.compose.ui.graphics.Brush
2923
import androidx.compose.ui.graphics.StrokeCap
3024
import androidx.compose.ui.unit.dp
25+
import dev.silenium.multimedia.compose.util.LocalFullscreenProvider
3126
import dev.silenium.multimedia.compose.util.deferredFlowStateOf
3227
import dev.silenium.multimedia.core.annotation.InternalMultimediaApi
3328
import kotlinx.coroutines.launch
@@ -47,6 +42,9 @@ fun VideoSurfaceControls(
4742
val loading by player.property<Boolean>("seeking")
4843
val backgroundColor = MaterialTheme.colors.surface
4944
val focus = remember(focusRequester) { focusRequester ?: FocusRequester() }
45+
var menuOpen by remember { mutableStateOf(false) }
46+
val fullscreenProvider = LocalFullscreenProvider.current
47+
5048
Box(modifier = modifier) {
5149
StateIndicatorIcon(player, Modifier.align(Alignment.Center))
5250
if (loading != false) {
@@ -149,6 +147,52 @@ fun VideoSurfaceControls(
149147
}
150148
VolumeSlider(player, coroutineScope)
151149
Spacer(modifier = Modifier.weight(1f))
150+
Box(modifier = Modifier.padding(horizontal = 4.dp)) {
151+
IconButton(
152+
onClick = { menuOpen = !menuOpen },
153+
) {
154+
Icon(
155+
Icons.Default.Settings,
156+
contentDescription = "Menu",
157+
tint = MaterialTheme.colors.onSurface,
158+
)
159+
}
160+
DropdownMenu(menuOpen, onDismissRequest = { menuOpen = false }) {
161+
DropdownMenuItem(onClick = { player.config.pixelPerfect = !player.config.pixelPerfect }) {
162+
Checkbox(
163+
player.config.pixelPerfect,
164+
onCheckedChange = {
165+
player.config.pixelPerfect = it
166+
},
167+
)
168+
Text("Pixel-Perfect Rendering")
169+
}
170+
}
171+
}
172+
IconButton(
173+
onClick = {
174+
fullscreenProvider.toggleFullscreen()
175+
},
176+
modifier = Modifier.padding(horizontal = 4.dp),
177+
) {
178+
AnimatedContent(fullscreenProvider.isFullscreen, transitionSpec = {
179+
ContentTransform(fadeIn(), fadeOut())
180+
}) { it ->
181+
if (it) {
182+
Icon(
183+
Icons.Default.FullscreenExit,
184+
contentDescription = "Exit Fullscreen",
185+
tint = MaterialTheme.colors.onSurface
186+
)
187+
} else {
188+
Icon(
189+
Icons.Default.Fullscreen,
190+
contentDescription = "Enter Fullscreen",
191+
tint = MaterialTheme.colors.onSurface
192+
)
193+
}
194+
}
195+
}
152196
}
153197
}
154198
}

0 commit comments

Comments
 (0)