From 0f39545e0f46b547abd78c4810c2d23ca38c40c2 Mon Sep 17 00:00:00 2001 From: Mitja Leino Date: Sun, 16 Jun 2024 16:46:13 +0300 Subject: [PATCH] Add settings to control highlight (only for styled) and fix tests --- .../kotlin/com/mituuz/fuzzier/FuzzyAction.kt | 6 +++- .../components/FuzzierSettingsComponent.kt | 16 ++++++++++- .../fuzzier/entities/FuzzyMatchContainer.kt | 28 ++++++++++++------- .../settings/FuzzierSettingsConfigurable.kt | 12 ++++++-- .../settings/FuzzierSettingsService.kt | 1 + .../com/mituuz/fuzzier/FuzzyActionTest.kt | 17 ++++++++++- .../FuzzierSettingsConfigurableTest.kt | 8 ++++-- 7 files changed, 70 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/com/mituuz/fuzzier/FuzzyAction.kt b/src/main/kotlin/com/mituuz/fuzzier/FuzzyAction.kt index 6c7f675..c40247d 100644 --- a/src/main/kotlin/com/mituuz/fuzzier/FuzzyAction.kt +++ b/src/main/kotlin/com/mituuz/fuzzier/FuzzyAction.kt @@ -183,7 +183,7 @@ abstract class FuzzyAction : AnAction() { } else { fuzzierSettingsService.state.filenameType } - renderer.text = container.toString(filenameType) + renderer.text = container.toString(filenameType, fuzzierSettingsService.state.highlightFilename) fuzzierSettingsService.state.fileListSpacing.let { renderer.border = BorderFactory.createEmptyBorder(it, 0, it, 0) } @@ -199,4 +199,8 @@ abstract class FuzzyAction : AnAction() { fun setFiletype(filenameType: FilenameType) { fuzzierSettingsService.state.filenameType = filenameType } + + fun setHighlight(highlight: Boolean) { + fuzzierSettingsService.state.highlightFilename = highlight + } } \ No newline at end of file diff --git a/src/main/kotlin/com/mituuz/fuzzier/components/FuzzierSettingsComponent.kt b/src/main/kotlin/com/mituuz/fuzzier/components/FuzzierSettingsComponent.kt index 4f3a44b..301b666 100644 --- a/src/main/kotlin/com/mituuz/fuzzier/components/FuzzierSettingsComponent.kt +++ b/src/main/kotlin/com/mituuz/fuzzier/components/FuzzierSettingsComponent.kt @@ -100,6 +100,16 @@ class FuzzierSettingsComponent { """.trimIndent(), false) + val highlightFilename = SettingsComponent(JBCheckBox(), "Highlight filename in file list*", + """ + This is still experimental and may cause some performance issues. +

+ Toggles highlighting of the filename on the file list. +
+ Only works with styled file list, which supports html styling. + """.trimIndent(), + false) + val fileListLimit = SettingsComponent(JBIntSpinner(50, 1, 5000), "File list limit", """ Controls how many files are shown and listed on the popup. @@ -194,11 +204,12 @@ class FuzzierSettingsComponent { .addComponent(recentFileModeSelector) .addComponent(prioritizeShortDirs) .addComponent(debounceTimerValue) - .addComponent(filenameTypeSelector) .addComponent(fileListLimit) .addSeparator() .addComponent(JBLabel("Popup styling")) + .addComponent(filenameTypeSelector) + .addComponent(highlightFilename) .addComponent(fileListFontSize) .addComponent(previewFontSize) .addComponent(fileListSpacing) @@ -256,6 +267,9 @@ class FuzzierSettingsComponent { for (filenameType in FilenameType.entries) { filenameTypeSelector.getFilenameTypeComboBox().addItem(filenameType) } + filenameTypeSelector.getFilenameTypeComboBox().addItemListener { + highlightFilename.getCheckBox().isEnabled = it.item == FilenameType.FILENAME_WITH_PATH_STYLED + } startTestBench.getButton().addActionListener { startTestBench.getButton().isEnabled = false diff --git a/src/main/kotlin/com/mituuz/fuzzier/entities/FuzzyMatchContainer.kt b/src/main/kotlin/com/mituuz/fuzzier/entities/FuzzyMatchContainer.kt index d6c103c..8e85043 100644 --- a/src/main/kotlin/com/mituuz/fuzzier/entities/FuzzyMatchContainer.kt +++ b/src/main/kotlin/com/mituuz/fuzzier/entities/FuzzyMatchContainer.kt @@ -30,9 +30,10 @@ import java.awt.Color class FuzzyMatchContainer(val score: FuzzyScore, var filePath: String, var filename: String, private var module: String = "") { private val color = JBColor.YELLOW - private val sm: String = "" - private val em: String = "" + private val startStyleTag: String = "" + private val endStyleTag: String = "" private var initialPath: String? = null + companion object { fun createOrderedContainer(order: Int, filePath: String, initialPath:String, filename: String): FuzzyMatchContainer { val fuzzyScore = FuzzyScore() @@ -47,13 +48,20 @@ class FuzzyMatchContainer(val score: FuzzyScore, var filePath: String, var filen } } - fun toString(filenameType: FilenameType): String { + fun toString(filenameType: FilenameType, highlight: Boolean): String { return when (filenameType) { FilenameType.FILENAME_ONLY -> filename FilenameType.FILE_PATH_ONLY -> filePath FilenameType.FILENAME_WITH_PATH -> "$filename ($filePath)" - FilenameType.FILENAME_WITH_PATH_STYLED -> getFilenameWithPathStyled() + FilenameType.FILENAME_WITH_PATH_STYLED -> getFilenameWithPathStyled(highlight) + } + } + + private fun getStyledFilename(highlight: Boolean): String { + if (highlight) { + return highlight(filename) } + return filename } fun highlight(source: String): String { @@ -62,17 +70,17 @@ class FuzzyMatchContainer(val score: FuzzyScore, var filePath: String, var filen val hlIndexes = score.highlightCharacters.sorted() for (i in hlIndexes) { if (i < source.length) { - stringBuilder.insert(i + offset, sm) - offset += sm.length - stringBuilder.insert(i + offset + 1, em) - offset += em.length + stringBuilder.insert(i + offset, startStyleTag) + offset += startStyleTag.length + stringBuilder.insert(i + offset + 1, endStyleTag) + offset += endStyleTag.length } } return stringBuilder.toString() } - private fun getFilenameWithPathStyled(): String { - return "${highlight(filename)} ($filePath" + private fun getFilenameWithPathStyled(highlight: Boolean): String { + return "${getStyledFilename(highlight)} ($filePath)" } fun getFileUri(): String { diff --git a/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurable.kt b/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurable.kt index 8f806ae..eab5fac 100644 --- a/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurable.kt +++ b/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurable.kt @@ -46,8 +46,10 @@ class FuzzierSettingsConfigurable : Configurable { component.recentFileModeSelector.getRecentFilesTypeComboBox().selectedIndex = state.recentFilesMode.ordinal component.prioritizeShortDirs.getCheckBox().isSelected = state.prioritizeShorterDirPaths component.debounceTimerValue.getIntSpinner().value = state.debouncePeriod - component.filenameTypeSelector.getFilenameTypeComboBox().selectedIndex = state.filenameType.ordinal component.fileListLimit.getIntSpinner().value = state.fileListLimit + + component.filenameTypeSelector.getFilenameTypeComboBox().selectedIndex = state.filenameType.ordinal + component.highlightFilename.getCheckBox().isSelected = state.highlightFilename component.fileListFontSize.getIntSpinner().value = state.fileListFontSize component.previewFontSize.getIntSpinner().value = state.previewFontSize component.fileListSpacing.getIntSpinner().value = state.fileListSpacing @@ -73,8 +75,10 @@ class FuzzierSettingsConfigurable : Configurable { || state.recentFilesMode != component.recentFileModeSelector.getRecentFilesTypeComboBox().selectedItem || state.prioritizeShorterDirPaths != component.prioritizeShortDirs.getCheckBox().isSelected || state.debouncePeriod != component.debounceTimerValue.getIntSpinner().value - || state.filenameType != component.filenameTypeSelector.getFilenameTypeComboBox().selectedItem || state.fileListLimit != component.fileListLimit.getIntSpinner().value + + || state.filenameType != component.filenameTypeSelector.getFilenameTypeComboBox().selectedItem + || state.highlightFilename != component.highlightFilename.getCheckBox().isSelected || state.fileListFontSize != component.fileListFontSize.getIntSpinner().value || state.previewFontSize != component.previewFontSize.getIntSpinner().value || state.fileListSpacing != component.fileListSpacing.getIntSpinner().value @@ -97,8 +101,10 @@ class FuzzierSettingsConfigurable : Configurable { state.recentFilesMode = RecentFilesMode.entries.toTypedArray()[component.recentFileModeSelector.getRecentFilesTypeComboBox().selectedIndex] state.prioritizeShorterDirPaths = component.prioritizeShortDirs.getCheckBox().isSelected state.debouncePeriod = component.debounceTimerValue.getIntSpinner().value as Int - state.filenameType = FilenameType.entries.toTypedArray()[component.filenameTypeSelector.getFilenameTypeComboBox().selectedIndex] state.fileListLimit = component.fileListLimit.getIntSpinner().value as Int + + state.filenameType = FilenameType.entries.toTypedArray()[component.filenameTypeSelector.getFilenameTypeComboBox().selectedIndex] + state.highlightFilename = component.highlightFilename.getCheckBox().isSelected state.fileListFontSize = component.fileListFontSize.getIntSpinner().value as Int state.previewFontSize = component.previewFontSize.getIntSpinner().value as Int state.fileListSpacing = component.fileListSpacing.getIntSpinner().value as Int diff --git a/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsService.kt b/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsService.kt index aa2522f..66a3264 100644 --- a/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsService.kt +++ b/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsService.kt @@ -48,6 +48,7 @@ class FuzzierSettingsService : PersistentStateComponent() + val component = renderer.getListCellRendererComponent(dummyList, container, 0, false, false) as JLabel + assertNotNull(component) + assertEquals("asd (/src/asd)", component.text) + } + + @Test + fun `Check renderer with styled path, with highlight but no values`() { + val action = getAction() + action.setFiletype(FILENAME_WITH_PATH_STYLED) + action.setHighlight(true) action.component = SimpleFinderComponent() val renderer = action.getCellRenderer() val container = FuzzyMatchContainer(FuzzyScore(), "/src/asd", "asd") diff --git a/src/test/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurableTest.kt b/src/test/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurableTest.kt index 6569b35..4b45f3d 100644 --- a/src/test/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurableTest.kt +++ b/src/test/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurableTest.kt @@ -43,8 +43,10 @@ class FuzzierSettingsConfigurableTest { state.recentFilesMode = NONE state.prioritizeShorterDirPaths = false state.debouncePeriod = 140 - state.filenameType = FILENAME_WITH_PATH_STYLED state.fileListLimit = 200 + + state.filenameType = FILENAME_WITH_PATH_STYLED + state.highlightFilename = false state.fileListFontSize = 15 state.previewFontSize = 0 state.fileListSpacing = 2 @@ -67,8 +69,10 @@ class FuzzierSettingsConfigurableTest { state.newTab = true state.recentFilesMode = RECENT_PROJECT_FILES state.debouncePeriod = 140 - state.filenameType = FILENAME_WITH_PATH_STYLED state.fileListLimit = 200 + + state.filenameType = FILENAME_WITH_PATH_STYLED + state.highlightFilename = false state.fileListFontSize = 15 state.previewFontSize = 0 state.fileListSpacing = 2