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 package org.jetbrains.plugins.template.toolWindow
import com.intellij.openapi.components.service
import com.intellij.openapi.project.DumbAware import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.wm.ToolWindow import com.intellij.openapi.wm.ToolWindow
import com.intellij.openapi.wm.ToolWindowFactory import com.intellij.openapi.wm.ToolWindowFactory
import org.jetbrains.jewel.bridge.addComposeTab import org.jetbrains.jewel.bridge.addComposeTab
import org.jetbrains.plugins.template.ui.ChatAppSample 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 import org.jetbrains.plugins.template.weatherApp.ui.WeatherAppSample
class MyToolWindowFactory : ToolWindowFactory, DumbAware { class MyToolWindowFactory : ToolWindowFactory, DumbAware {
override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) { 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() } 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.background
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color.Companion.Transparent import androidx.compose.ui.graphics.Color.Companion.Transparent
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.intellij.openapi.components.service
import org.jetbrains.jewel.bridge.retrieveColorOrUnspecified import org.jetbrains.jewel.bridge.retrieveColorOrUnspecified
import org.jetbrains.jewel.foundation.lazy.SelectableLazyColumn import org.jetbrains.jewel.foundation.lazy.SelectableLazyColumn
import org.jetbrains.jewel.foundation.lazy.SelectionMode 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 import org.jetbrains.plugins.template.weatherApp.ui.components.WeatherDetailsCard
@Composable @Composable
internal fun WeatherAppSample() { internal fun WeatherAppSample(
val viewModel: MyLocationsViewModel = service<MyLocationsViewModel>() myLocationViewModel: MyLocationsViewModelApi,
val searchAutoCompletionItemProvided = service<LocationsProvider>() weatherViewModelApi: WeatherViewModelApi,
searchAutoCompletionItemProvided: LocationsProvider
) {
HorizontalSplitLayout( HorizontalSplitLayout(
first = { LeftColumn(viewModel, modifier = Modifier.fillMaxSize()) }, first = { LeftColumn(myLocationViewModel, modifier = Modifier.fillMaxSize()) },
second = { second = {
RightColumn( RightColumn(
viewModel, myLocationViewModel,
viewModel, weatherViewModelApi,
searchAutoCompletionItemProvided, searchAutoCompletionItemProvided,
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) )
@ -60,6 +61,12 @@ private fun LeftColumn(
Spacer(modifier = Modifier.height(4.dp)) Spacer(modifier = Modifier.height(4.dp))
val listState = rememberSelectableLazyListState() val listState = rememberSelectableLazyListState()
LaunchedEffect(myLocations) {
listState
.selectedKeys = myLocations
.mapIndexedNotNull { index, item -> if (item.isSelected) index else null }
.toSet()
}
SelectableLazyColumn( SelectableLazyColumn(
modifier = modifier.fillMaxSize(), modifier = modifier.fillMaxSize(),