diff --git a/app/src/main/java/de/jadehs/strassenschadenpro2/MainScreen.kt b/app/src/main/java/de/jadehs/strassenschadenpro2/MainScreen.kt index a105c9a..7848f74 100644 --- a/app/src/main/java/de/jadehs/strassenschadenpro2/MainScreen.kt +++ b/app/src/main/java/de/jadehs/strassenschadenpro2/MainScreen.kt @@ -36,6 +36,11 @@ fun MainScreen(modifier: Modifier = Modifier, application: Application) { var selectedIndex by remember { mutableStateOf(0) } + val mapViewModel = remember { MapViewModel(application) } + val listViewModel = remember { ListViewModel(application) } + + var selectedObjectId by remember { mutableStateOf(null) } + Scaffold(modifier = Modifier.fillMaxSize(), bottomBar = { NavigationBar { @@ -52,18 +57,36 @@ fun MainScreen(modifier: Modifier = Modifier, application: Application) { } }) { innerPadding -> - ContentScreen(modifier = Modifier.padding(innerPadding), selectedIndex, application) + ContentScreen(modifier = Modifier.padding(innerPadding), + selectedIndex, + mapViewModel, + listViewModel, + selectedObjectId, + onFeatureSelected = { objectId -> + selectedObjectId = objectId + selectedIndex = 0 + }, + onObjectIdUsed = { + selectedObjectId = null + }) } } @Composable -fun ContentScreen(modifier: Modifier = Modifier, selectedIndex: Int, application: Application) { - val mapViewModel = remember { MapViewModel(application) } - val listViewModel = remember { ListViewModel(application) } +fun ContentScreen( + modifier: Modifier = Modifier, + selectedIndex: Int, + mapViewModel: MapViewModel, + listViewModel: ListViewModel, + selectedObjectId: Int?, + onFeatureSelected: (Int) -> Unit, + onObjectIdUsed: () -> Unit +) { + when(selectedIndex) { - 0 -> MapPage(modifier = modifier, mapViewModel = mapViewModel) + 0 -> MapPage(modifier = modifier, mapViewModel = mapViewModel,selectedObjectId=selectedObjectId, onObjectIdUsed = onObjectIdUsed) 1 -> CreatePage(modifier = modifier, mapViewModel = mapViewModel) - 2 -> ListPage(modifier = modifier, listViewModel = listViewModel) + 2 -> ListPage(modifier = modifier, listViewModel = listViewModel, onFeatureClick = onFeatureSelected) 3 -> SettingsPage() } } \ No newline at end of file diff --git a/app/src/main/java/de/jadehs/strassenschadenpro2/MapViewModel.kt b/app/src/main/java/de/jadehs/strassenschadenpro2/MapViewModel.kt index 4b0ff49..ed1f7e0 100644 --- a/app/src/main/java/de/jadehs/strassenschadenpro2/MapViewModel.kt +++ b/app/src/main/java/de/jadehs/strassenschadenpro2/MapViewModel.kt @@ -10,6 +10,7 @@ import androidx.lifecycle.viewModelScope import com.arcgismaps.LoadStatus import com.arcgismaps.data.ArcGISFeature import com.arcgismaps.data.CodedValueDomain +import com.arcgismaps.data.QueryParameters import com.arcgismaps.data.ServiceFeatureTable import com.arcgismaps.geometry.GeometryEngine import com.arcgismaps.geometry.Point @@ -336,6 +337,28 @@ class MapViewModel(application: Application): AndroidViewModel(application) { } } } + + fun zoomToFeature(objectId: Int){ + viewModelScope.launch { + val queryParameters = QueryParameters().apply { + whereClause = "OBJECTID = ${objectId}" + } + serviceFeatureTable.queryFeatures(queryParameters).onSuccess { + featureResult -> + val feature = featureResult.firstOrNull() as? ArcGISFeature + feature?.let{ feature-> + feature.geometry?.let{ geometry -> + mapViewProxy.setViewpointGeometry(geometry,50.0) + } + featureLayer.clearSelection() + featureLayer.selectFeature(feature) + selectedFeature = feature + } + }.onFailure { error -> + snackBarMessage = "Feature nicht gefunden!" + } + } + } } enum class FeatureOperationType(val operationName: String, val instruction: String) { diff --git a/app/src/main/java/de/jadehs/strassenschadenpro2/pages/ListPage.kt b/app/src/main/java/de/jadehs/strassenschadenpro2/pages/ListPage.kt index c8646a5..24ee72c 100644 --- a/app/src/main/java/de/jadehs/strassenschadenpro2/pages/ListPage.kt +++ b/app/src/main/java/de/jadehs/strassenschadenpro2/pages/ListPage.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Divider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -19,7 +20,7 @@ import de.jadehs.strassenschadenpro2.Feature import de.jadehs.strassenschadenpro2.ListViewModel @Composable -fun ListPage(modifier: Modifier = Modifier, listViewModel: ListViewModel) { +fun ListPage(modifier: Modifier = Modifier, listViewModel: ListViewModel, onFeatureClick: (Int) -> Unit) { val features = listViewModel.features.collectAsState() LaunchedEffect(Unit) { listViewModel.fetch() @@ -30,7 +31,9 @@ fun ListPage(modifier: Modifier = Modifier, listViewModel: ListViewModel) { items(features.value){ feature -> FeatureItem(feature = feature, onClick = { - + feature.properties?.OBJECTID?.let { objectId -> + onFeatureClick(objectId) + } } ) } @@ -52,5 +55,23 @@ fun FeatureItem(feature: Feature, onClick: () -> Unit){ text = "Beschreibung: ${feature.properties?.Beschreibung ?: "-"}", style = MaterialTheme.typography.bodyMedium ) + + val coords = feature.geometry?.coordinates + val coordsText = if (coords != null && coords.size == 2) "${coords[0]}, ${coords[1]}" else "-" + Text( + text = "Koordinaten: ${coordsText}", + style = MaterialTheme.typography.bodySmall + ) + Divider(modifier = Modifier.padding(top= 12.dp)) } -} \ No newline at end of file +} + + + + + + + + + + diff --git a/app/src/main/java/de/jadehs/strassenschadenpro2/pages/MapPage.kt b/app/src/main/java/de/jadehs/strassenschadenpro2/pages/MapPage.kt index 2a0de87..6368ab5 100644 --- a/app/src/main/java/de/jadehs/strassenschadenpro2/pages/MapPage.kt +++ b/app/src/main/java/de/jadehs/strassenschadenpro2/pages/MapPage.kt @@ -40,7 +40,10 @@ import de.jadehs.strassenschadenpro2.components.DropDownMenuBox import kotlinx.coroutines.launch @Composable -fun MapPage(modifier: Modifier = Modifier, mapViewModel: MapViewModel) { +fun MapPage(modifier: Modifier = Modifier, + mapViewModel: MapViewModel, + selectedObjectId: Int? = null, + onObjectIdUsed: () -> Unit = {}) { val context = LocalContext.current val coroutineScope = rememberCoroutineScope() @@ -55,6 +58,13 @@ fun MapPage(modifier: Modifier = Modifier, mapViewModel: MapViewModel) { setAutoPanMode(LocationDisplayAutoPanMode.Off) } + LaunchedEffect(selectedObjectId) { + selectedObjectId?.let{ + mapViewModel.zoomToFeature(selectedObjectId) + onObjectIdUsed() + } + } + if (checkPermissions(context)) { // Permissions are already granted. LaunchedEffect(Unit) {