diff --git a/roborazzi-idea-plugin/src/main/kotlin/com/github/takahirom/roborazzi/idea/preview/PreviewViewModel.kt b/roborazzi-idea-plugin/src/main/kotlin/com/github/takahirom/roborazzi/idea/preview/PreviewViewModel.kt index 540ecf22e..5d595fd39 100644 --- a/roborazzi-idea-plugin/src/main/kotlin/com/github/takahirom/roborazzi/idea/preview/PreviewViewModel.kt +++ b/roborazzi-idea-plugin/src/main/kotlin/com/github/takahirom/roborazzi/idea/preview/PreviewViewModel.kt @@ -32,6 +32,7 @@ class PreviewViewModel { var coroutineScope = MainScope() val imagesStateFlow = MutableStateFlow<List<Pair<String, Long>>>(listOf()) + private val searchText = MutableStateFlow("") private val lastEditingFileName = MutableStateFlow<String?>(null) val statusText = MutableStateFlow("No images found") private val _dropDownUiState = MutableStateFlow(ActionToolbarUiState()) @@ -70,6 +71,16 @@ class PreviewViewModel { } } + fun onSearchTextChanged(project: Project, text: String) { + searchText.value = text + coroutineScope.launch { + updateListJob?.cancel() + refreshListProcess(project) + selectListIndexByCaret(project) + fetchTasks(project) + } + } + fun onRefreshButtonClicked(project: Project, selectedTaskName: String) { roborazziLog("Executing task '$selectedTaskName'...") _dropDownUiState.update { currentUiState -> @@ -194,8 +205,14 @@ class PreviewViewModel { } } - allPreviewImageFiles.addAll(findImages(classes, files)) - allPreviewImageFiles.addAll(findImages(functions, files)) + allPreviewImageFiles.addAll( + findImages(classes, files) + .filter { it.name.contains(searchText.value, ignoreCase = true) } + ) + allPreviewImageFiles.addAll( + findImages(functions, files) + .filter { it.name.contains(searchText.value, ignoreCase = true) } + ) if (allPreviewImageFiles.isEmpty()) { statusText.value = "No images found" diff --git a/roborazzi-idea-plugin/src/main/kotlin/com/github/takahirom/roborazzi/idea/preview/RoborazziPreviewTool.kt b/roborazzi-idea-plugin/src/main/kotlin/com/github/takahirom/roborazzi/idea/preview/RoborazziPreviewTool.kt index 3b7230daf..438c827e9 100644 --- a/roborazzi-idea-plugin/src/main/kotlin/com/github/takahirom/roborazzi/idea/preview/RoborazziPreviewTool.kt +++ b/roborazzi-idea-plugin/src/main/kotlin/com/github/takahirom/roborazzi/idea/preview/RoborazziPreviewTool.kt @@ -24,6 +24,7 @@ import com.intellij.ui.components.JBBox import com.intellij.ui.components.JBLabel import com.intellij.ui.components.JBList import com.intellij.ui.components.JBScrollPane +import com.intellij.ui.components.JBTextField import com.intellij.ui.content.ContentFactory import com.intellij.util.containers.SLRUMap import com.intellij.util.messages.MessageBusConnection @@ -49,13 +50,17 @@ import javax.swing.JPanel import javax.swing.JScrollPane import javax.swing.ListCellRenderer import javax.swing.ListSelectionModel +import javax.swing.event.DocumentEvent +import javax.swing.event.DocumentListener class RoborazziPreviewToolWindowFactory : ToolWindowFactory { override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) { val contentFactory = ContentFactory.getInstance() val panel = RoborazziPreviewPanel(project) + val content = contentFactory.createContent(panel, "", false) + toolWindow.contentManager.addContent(content) if (toolWindow is ToolWindowEx) { @@ -160,6 +165,22 @@ class RoborazziPreviewPanel(project: Project) : JPanel(BorderLayout()) { anchor = GridBagConstraints.WEST insets = JBUI.insets(4) }) + add((JBTextField().apply { + emptyText.text = "Enter screenshot name..." + document.addDocumentListener(object : DocumentListener { + override fun insertUpdate(e: DocumentEvent) { + viewModel?.onSearchTextChanged(project, text) + } + + override fun removeUpdate(e: DocumentEvent) { + viewModel?.onSearchTextChanged(project, text) + } + + override fun changedUpdate(e: DocumentEvent) { + viewModel?.onSearchTextChanged(project, text) + } + }) + })) }, BorderLayout.SOUTH) viewModel?.onInit(project) imageList.addListSelectionListener { event ->