Pass viewmodels as a composable param

This commit is contained in:
Nebojsa Vuksic 2025-07-28 15:49:59 +02:00
parent 6f47941636
commit 2486e30710
2 changed files with 27 additions and 9 deletions

View File

@ -1,17 +1,28 @@
package org.jetbrains.plugins.template.toolWindow
import com.intellij.openapi.components.service
import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.project.Project
import com.intellij.openapi.wm.ToolWindow
import com.intellij.openapi.wm.ToolWindowFactory
import org.jetbrains.jewel.bridge.addComposeTab
import org.jetbrains.plugins.template.ui.ChatAppSample
import org.jetbrains.plugins.template.weatherApp.services.LocationsProvider
import org.jetbrains.plugins.template.weatherApp.services.MyLocationsViewModel
import org.jetbrains.plugins.template.weatherApp.ui.WeatherAppSample
class MyToolWindowFactory : ToolWindowFactory, DumbAware {
override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) {
toolWindow.addComposeTab("Weather App") { WeatherAppSample() }
toolWindow.addComposeTab("Weather App") {
val viewModel = service<MyLocationsViewModel>()
val locationProviderApi = service<LocationsProvider>()
WeatherAppSample(
viewModel,
viewModel,
locationProviderApi
)
}
toolWindow.addComposeTab("Chat App") { ChatAppSample() }
}

View File

@ -3,13 +3,13 @@ package org.jetbrains.plugins.template.weatherApp.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color.Companion.Transparent
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.intellij.openapi.components.service
import org.jetbrains.jewel.bridge.retrieveColorOrUnspecified
import org.jetbrains.jewel.foundation.lazy.SelectableLazyColumn
import org.jetbrains.jewel.foundation.lazy.SelectionMode
@ -24,16 +24,17 @@ import org.jetbrains.plugins.template.weatherApp.ui.components.SearchToolbarMenu
import org.jetbrains.plugins.template.weatherApp.ui.components.WeatherDetailsCard
@Composable
internal fun WeatherAppSample() {
val viewModel: MyLocationsViewModel = service<MyLocationsViewModel>()
val searchAutoCompletionItemProvided = service<LocationsProvider>()
internal fun WeatherAppSample(
myLocationViewModel: MyLocationsViewModelApi,
weatherViewModelApi: WeatherViewModelApi,
searchAutoCompletionItemProvided: LocationsProvider
) {
HorizontalSplitLayout(
first = { LeftColumn(viewModel, modifier = Modifier.fillMaxSize()) },
first = { LeftColumn(myLocationViewModel, modifier = Modifier.fillMaxSize()) },
second = {
RightColumn(
viewModel,
viewModel,
myLocationViewModel,
weatherViewModelApi,
searchAutoCompletionItemProvided,
modifier = Modifier.fillMaxSize()
)
@ -60,6 +61,12 @@ private fun LeftColumn(
Spacer(modifier = Modifier.height(4.dp))
val listState = rememberSelectableLazyListState()
LaunchedEffect(myLocations) {
listState
.selectedKeys = myLocations
.mapIndexedNotNull { index, item -> if (item.isSelected) index else null }
.toSet()
}
SelectableLazyColumn(
modifier = modifier.fillMaxSize(),