From 0935cd88d434f26fe958aebf237e65ea703b7b8c Mon Sep 17 00:00:00 2001 From: DarkCat09 Date: Tue, 6 Jun 2023 14:57:49 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D1=91=D1=81=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=80=D1=82=D1=83=20=D0=B2=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BE=20state?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/nm17/narodmon/ui/elements/TileMap.kt | 57 +++++++++++++++++++ .../java/ru/nm17/narodmon/ui/pages/Sensors.kt | 16 +----- .../narodmon/ui/viewmodel/MapViewModel.kt | 39 ------------- 3 files changed, 59 insertions(+), 53 deletions(-) create mode 100644 app/src/main/java/ru/nm17/narodmon/ui/elements/TileMap.kt delete mode 100644 app/src/main/java/ru/nm17/narodmon/ui/viewmodel/MapViewModel.kt diff --git a/app/src/main/java/ru/nm17/narodmon/ui/elements/TileMap.kt b/app/src/main/java/ru/nm17/narodmon/ui/elements/TileMap.kt new file mode 100644 index 0000000..6f20744 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/elements/TileMap.kt @@ -0,0 +1,57 @@ +package ru.nm17.narodmon.ui.elements + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import io.ktor.client.HttpClient +import io.ktor.client.engine.cio.CIO +import io.ktor.client.request.get +import io.ktor.client.statement.bodyAsChannel +import io.ktor.utils.io.jvm.javaio.toInputStream +import ovh.plrapps.mapcompose.api.addLayer +import ovh.plrapps.mapcompose.api.scale +import ovh.plrapps.mapcompose.api.setScroll +import ovh.plrapps.mapcompose.core.TileStreamProvider +import ovh.plrapps.mapcompose.ui.MapUI +import ovh.plrapps.mapcompose.ui.state.MapState +import java.io.InputStream + +const val mapSize = 32768 + +val client = HttpClient(CIO) +val tileStreamProvider = TileStreamProvider { row, col, zoom -> + requestTile(row, col, zoom) +} + +suspend fun requestTile(row: Int, col: Int, zoom: Int): InputStream { + val response = client.get("https://tile.openstreetmap.org/${zoom}/${col}/${row}.png") + return response.bodyAsChannel().toInputStream() +} + +@Composable +fun TileMap(modifier: Modifier = Modifier) { + val state by remember { + mutableStateOf( + MapState( + levelCount = 8, + fullWidth = mapSize, + fullHeight = mapSize, + workerCount = 16, + ).apply { + addLayer(tileStreamProvider) + } + ) + } + + LaunchedEffect(state) { + // TODO: Подгружать сохранённую позицию + state.setScroll(Offset(28702.6F, 14787.6F)) + state.scale = 1.4658884F + } + + MapUI(modifier = modifier, state = state) +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/pages/Sensors.kt b/app/src/main/java/ru/nm17/narodmon/ui/pages/Sensors.kt index 6bd37c1..8ff760f 100644 --- a/app/src/main/java/ru/nm17/narodmon/ui/pages/Sensors.kt +++ b/app/src/main/java/ru/nm17/narodmon/ui/pages/Sensors.kt @@ -9,23 +9,18 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FilterChip import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Offset import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import ovh.plrapps.mapcompose.api.scale -import ovh.plrapps.mapcompose.api.setScroll -import ovh.plrapps.mapcompose.ui.MapUI import ru.nm17.narodmon.R import ru.nm17.narodmon.ui.elements.GenericNavScaffold -import ru.nm17.narodmon.ui.viewmodel.MapViewModel +import ru.nm17.narodmon.ui.elements.TileMap enum class SensorsFilter { All, Thermometer, Camera, @@ -34,24 +29,17 @@ enum class SensorsFilter { @ExperimentalMaterial3Api @Composable fun SensorsPage(navController: NavController) { - val mapVM by remember { mutableStateOf(MapViewModel()) } var filter by remember { mutableStateOf(SensorsFilter.All) } val scrConfig = LocalConfiguration.current val mapHeight = scrConfig.screenHeightDp / 3 - - LaunchedEffect(mapVM) { - // TODO: Подгружать сохранённую позицию - mapVM.state.setScroll(Offset(28702.6F, 14787.6F)) - mapVM.state.scale = 1.4658884F - } GenericNavScaffold( title = { Text(text = stringResource(R.string.sensors_page_title)) } ) { Column(modifier = Modifier.padding(it)) { - MapUI(state = mapVM.state, modifier = Modifier.height(mapHeight.dp)) + TileMap(modifier = Modifier.height(mapHeight.dp)) Row( modifier = Modifier.padding(horizontal = 8.dp), diff --git a/app/src/main/java/ru/nm17/narodmon/ui/viewmodel/MapViewModel.kt b/app/src/main/java/ru/nm17/narodmon/ui/viewmodel/MapViewModel.kt deleted file mode 100644 index 4d330ba..0000000 --- a/app/src/main/java/ru/nm17/narodmon/ui/viewmodel/MapViewModel.kt +++ /dev/null @@ -1,39 +0,0 @@ -package ru.nm17.narodmon.ui.viewmodel - -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.lifecycle.ViewModel -import io.ktor.client.HttpClient -import io.ktor.client.engine.cio.CIO -import io.ktor.client.request.get -import io.ktor.client.statement.bodyAsChannel -import io.ktor.utils.io.jvm.javaio.toInputStream -import ovh.plrapps.mapcompose.api.addLayer -import ovh.plrapps.mapcompose.core.TileStreamProvider -import ovh.plrapps.mapcompose.ui.state.MapState -import java.io.InputStream - -class MapViewModel : ViewModel() { - private val client = HttpClient(CIO) - - private val tileStreamProvider = TileStreamProvider { row, col, zoom -> - requestTile(row, col, zoom) - } - - private val mapSize = 32768 - val state: MapState by mutableStateOf( - MapState( - levelCount = 8, - fullWidth = mapSize, - fullHeight = mapSize, - workerCount = 16, - ).apply { - addLayer(tileStreamProvider) - } - ) - - private suspend fun requestTile(row: Int, col: Int, zoom: Int): InputStream { - val response = client.get("https://tile.openstreetmap.org/${zoom}/${col}/${row}.png") - return response.bodyAsChannel().toInputStream() - } -} \ No newline at end of file