From c5947721b569aac858648f2f2674a3cab2a16f52 Mon Sep 17 00:00:00 2001 From: Steve Yegge Date: Mon, 8 Jul 2024 21:42:10 -0700 Subject: [PATCH 1/4] Several fixes for Hotkey Inlay Hints - there is a new Preferences option for disabling it - the hint no longer draws if the selection is only on one line - this takes care of many annoying cases, such as Find/Replace lighting it up everywhere - the hint now always draws below the last line of the selection. - this makes it less intrusive, IMO, as it's out of the way of the cursor - it's more intuitive, I think -- several users claim that it "used to work that way". It never actually worked that way; it always drew at the end of the last line of the selection. But now it does work that way. - coincidentally and usefully, this also fixes CODY-2541 - getting the hint inlay out of the way of the cursor removed the interference fixes: CODY-2541 --- .../cody/config/CodyApplicationSettings.kt | 2 ++ .../sourcegraph/cody/config/SettingsModel.kt | 1 + .../cody/config/ui/CodyConfigurable.kt | 22 ++++++++++++++++--- .../listeners/CodySelectionInlayManager.kt | 18 ++++++++++----- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/com/sourcegraph/cody/config/CodyApplicationSettings.kt b/src/main/kotlin/com/sourcegraph/cody/config/CodyApplicationSettings.kt index 8d2d4e3639..0f71392f0d 100644 --- a/src/main/kotlin/com/sourcegraph/cody/config/CodyApplicationSettings.kt +++ b/src/main/kotlin/com/sourcegraph/cody/config/CodyApplicationSettings.kt @@ -18,6 +18,7 @@ data class CodyApplicationSettings( var isCustomAutocompleteColorEnabled: Boolean = false, var customAutocompleteColor: Int? = null, var isLookupAutocompleteEnabled: Boolean = true, + var isCodyUIHintsEnabled: Boolean = true, var blacklistedLanguageIds: List = listOf(), var isOnboardingGuidanceDismissed: Boolean = false, var shouldAcceptNonTrustedCertificatesAutomatically: Boolean = false, @@ -37,6 +38,7 @@ data class CodyApplicationSettings( this.isCustomAutocompleteColorEnabled = state.isCustomAutocompleteColorEnabled this.customAutocompleteColor = state.customAutocompleteColor this.isLookupAutocompleteEnabled = state.isLookupAutocompleteEnabled + this.isCodyUIHintsEnabled = state.isCodyUIHintsEnabled this.blacklistedLanguageIds = state.blacklistedLanguageIds this.isOnboardingGuidanceDismissed = state.isOnboardingGuidanceDismissed this.shouldAcceptNonTrustedCertificatesAutomatically = diff --git a/src/main/kotlin/com/sourcegraph/cody/config/SettingsModel.kt b/src/main/kotlin/com/sourcegraph/cody/config/SettingsModel.kt index f77f3019a7..72afcbd99f 100644 --- a/src/main/kotlin/com/sourcegraph/cody/config/SettingsModel.kt +++ b/src/main/kotlin/com/sourcegraph/cody/config/SettingsModel.kt @@ -12,6 +12,7 @@ data class SettingsModel( var isCustomAutocompleteColorEnabled: Boolean = false, var customAutocompleteColor: Color? = null, var isLookupAutocompleteEnabled: Boolean = true, + var isCodyUIHintsEnabled: Boolean = true, var blacklistedLanguageIds: List = listOf(), var shouldAcceptNonTrustedCertificatesAutomatically: Boolean = false, var shouldCheckForUpdates: Boolean = false diff --git a/src/main/kotlin/com/sourcegraph/cody/config/ui/CodyConfigurable.kt b/src/main/kotlin/com/sourcegraph/cody/config/ui/CodyConfigurable.kt index 27ee172a30..26c848cc6b 100644 --- a/src/main/kotlin/com/sourcegraph/cody/config/ui/CodyConfigurable.kt +++ b/src/main/kotlin/com/sourcegraph/cody/config/ui/CodyConfigurable.kt @@ -1,13 +1,18 @@ package com.sourcegraph.cody.config.ui -import com.intellij.openapi.components.service import com.intellij.openapi.options.BoundConfigurable import com.intellij.openapi.project.Project import com.intellij.openapi.ui.DialogPanel import com.intellij.ui.ColorPanel import com.intellij.ui.JBColor import com.intellij.ui.components.JBCheckBox -import com.intellij.ui.dsl.builder.* +import com.intellij.ui.dsl.builder.Cell +import com.intellij.ui.dsl.builder.MAX_LINE_LENGTH_NO_WRAP +import com.intellij.ui.dsl.builder.Row +import com.intellij.ui.dsl.builder.bindSelected +import com.intellij.ui.dsl.builder.panel +import com.intellij.ui.dsl.builder.selected +import com.intellij.ui.dsl.builder.toMutableProperty import com.intellij.ui.dsl.gridLayout.HorizontalAlign import com.intellij.ui.layout.and import com.sourcegraph.cody.config.CodyApplicationSettings @@ -21,7 +26,7 @@ import com.sourcegraph.config.ConfigUtil class CodyConfigurable(val project: Project) : BoundConfigurable(ConfigUtil.CODY_DISPLAY_NAME) { private lateinit var dialogPanel: DialogPanel private val settingsModel = SettingsModel() - private val codyApplicationSettings = service() + private val codyApplicationSettings = CodyApplicationSettings.instance override fun createPanel(): DialogPanel { dialogPanel = panel { @@ -30,12 +35,21 @@ class CodyConfigurable(val project: Project) : BoundConfigurable(ConfigUtil.CODY group("Cody") { row { enableCodyCheckbox = + @Suppress("DialogTitleCapitalization") checkBox("Enable Cody") .comment( "Disable this to turn off all AI-based functionality of the plugin, including the Cody chat sidebar and autocomplete", MAX_LINE_LENGTH_NO_WRAP) .bindSelected(settingsModel::isCodyEnabled) } + row { + checkBox("Enable UI Hints") + .comment( + "Disable this to turn off the display of UI hints and help features", + MAX_LINE_LENGTH_NO_WRAP) + .enabledIf(enableCodyCheckbox.selected) + .bindSelected(settingsModel::isCodyUIHintsEnabled) + } row { enableDebugCheckbox = checkBox("Enable debug") @@ -105,6 +119,7 @@ class CodyConfigurable(val project: Project) : BoundConfigurable(ConfigUtil.CODY // note: this sets the same value for both light & dark mode, currently codyApplicationSettings.customAutocompleteColor?.let { JBColor(it, it) } settingsModel.isLookupAutocompleteEnabled = codyApplicationSettings.isLookupAutocompleteEnabled + settingsModel.isCodyUIHintsEnabled = codyApplicationSettings.isCodyUIHintsEnabled settingsModel.blacklistedLanguageIds = codyApplicationSettings.blacklistedLanguageIds settingsModel.shouldAcceptNonTrustedCertificatesAutomatically = codyApplicationSettings.shouldAcceptNonTrustedCertificatesAutomatically @@ -137,6 +152,7 @@ class CodyConfigurable(val project: Project) : BoundConfigurable(ConfigUtil.CODY settingsModel.isCustomAutocompleteColorEnabled codyApplicationSettings.customAutocompleteColor = settingsModel.customAutocompleteColor?.rgb codyApplicationSettings.isLookupAutocompleteEnabled = settingsModel.isLookupAutocompleteEnabled + codyApplicationSettings.isCodyUIHintsEnabled = settingsModel.isCodyUIHintsEnabled codyApplicationSettings.blacklistedLanguageIds = settingsModel.blacklistedLanguageIds codyApplicationSettings.shouldAcceptNonTrustedCertificatesAutomatically = settingsModel.shouldAcceptNonTrustedCertificatesAutomatically diff --git a/src/main/kotlin/com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt b/src/main/kotlin/com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt index 6891ee727a..1ca6453d48 100644 --- a/src/main/kotlin/com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt +++ b/src/main/kotlin/com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt @@ -11,6 +11,7 @@ import com.intellij.openapi.editor.markup.TextAttributes import com.intellij.openapi.keymap.KeymapManager import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer +import com.sourcegraph.cody.config.CodyApplicationSettings import com.sourcegraph.cody.edit.FixupService import java.awt.Font import java.awt.Graphics @@ -41,17 +42,22 @@ class CodySelectionInlayManager(val project: Project) { val startOffset = event.newRange.startOffset val endOffset = event.newRange.endOffset if (startOffset == endOffset) { - // Don't show if there's no selection. - return + return // Don't show if there's no selection. } - val startLine = editor.document.getLineNumber(startOffset) - val endLine = editor.document.getLineNumber(endOffset) + val document = editor.document + val startLine = document.getLineNumber(startOffset) + val endLine = document.getLineNumber(endOffset) val selectionEndLine = if (startOffset > endOffset) startLine else endLine - + // Don't show if selection is only on one line, as it can be distracting. + if (startLine == selectionEndLine) { + return + } val editShortcutText = getKeyStrokeText("cody.editCodeAction") val inlayContent = "$editShortcutText to Edit" - updateInlay(editor, inlayContent, selectionEndLine) + val bottomLine = // Try to put it beneath the selection. At the end was unpopular. + if (selectionEndLine + 1 < document.lineCount) selectionEndLine + 1 else selectionEndLine + updateInlay(editor, inlayContent, bottomLine) } private fun updateInlay(editor: Editor, content: String, line: Int) { From 17e7b012c8c0def5ea71eed388caee003934ecba Mon Sep 17 00:00:00 2001 From: Steve Yegge Date: Mon, 8 Jul 2024 23:31:03 -0700 Subject: [PATCH 2/4] spotless --- .../com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/kotlin/com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt b/src/main/kotlin/com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt index 1ca6453d48..cdcd6adff8 100644 --- a/src/main/kotlin/com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt +++ b/src/main/kotlin/com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt @@ -11,7 +11,6 @@ import com.intellij.openapi.editor.markup.TextAttributes import com.intellij.openapi.keymap.KeymapManager import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer -import com.sourcegraph.cody.config.CodyApplicationSettings import com.sourcegraph.cody.edit.FixupService import java.awt.Font import java.awt.Graphics From 54d8e2a6a1ab2dfc56edb512f6c4691528f7bcbc Mon Sep 17 00:00:00 2001 From: Steve Yegge Date: Tue, 9 Jul 2024 07:30:38 -0700 Subject: [PATCH 3/4] check the isCodyUIHintsEnabled setting --- .../sourcegraph/cody/listeners/CodySelectionInlayManager.kt | 3 ++- src/main/kotlin/com/sourcegraph/config/ConfigUtil.kt | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt b/src/main/kotlin/com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt index cdcd6adff8..337ebb8256 100644 --- a/src/main/kotlin/com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt +++ b/src/main/kotlin/com/sourcegraph/cody/listeners/CodySelectionInlayManager.kt @@ -12,6 +12,7 @@ import com.intellij.openapi.keymap.KeymapManager import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import com.sourcegraph.cody.edit.FixupService +import com.sourcegraph.config.ConfigUtil import java.awt.Font import java.awt.Graphics import java.awt.Graphics2D @@ -28,7 +29,6 @@ class CodySelectionInlayManager(val project: Project) { fun handleSelectionChanged(editor: Editor, event: SelectionEvent) { clearInlay() - val service = FixupService.getInstance(project) if (!service.isEligibleForInlineEdit(editor)) { return @@ -37,6 +37,7 @@ class CodySelectionInlayManager(val project: Project) { if (service.getActiveSession() != null) { return } + if (!ConfigUtil.isCodyUIHintsEnabled()) return // User-disabled. val startOffset = event.newRange.startOffset val endOffset = event.newRange.endOffset diff --git a/src/main/kotlin/com/sourcegraph/config/ConfigUtil.kt b/src/main/kotlin/com/sourcegraph/config/ConfigUtil.kt index 4026ea7252..0a875b1235 100644 --- a/src/main/kotlin/com/sourcegraph/config/ConfigUtil.kt +++ b/src/main/kotlin/com/sourcegraph/config/ConfigUtil.kt @@ -16,10 +16,10 @@ import com.sourcegraph.cody.config.CodyAuthenticationManager import com.sourcegraph.cody.config.ServerAuthLoader import com.sourcegraph.cody.config.SourcegraphServerPath import com.sourcegraph.cody.config.SourcegraphServerPath.Companion.from -import java.nio.file.Path -import java.nio.file.Paths import org.jetbrains.annotations.Contract import org.jetbrains.annotations.VisibleForTesting +import java.nio.file.Path +import java.nio.file.Paths object ConfigUtil { const val DOTCOM_URL = "https://sourcegraph.com/" @@ -131,6 +131,8 @@ object ConfigUtil { @JvmStatic fun isCodyDebugEnabled(): Boolean = CodyApplicationSettings.instance.isCodyDebugEnabled + @JvmStatic fun isCodyUIHintsEnabled(): Boolean = CodyApplicationSettings.instance.isCodyUIHintsEnabled + @JvmStatic fun isCodyVerboseDebugEnabled(): Boolean = CodyApplicationSettings.instance.isCodyVerboseDebugEnabled From 32015a4e2a51c3d305f3b0dbfd2a106285ee466f Mon Sep 17 00:00:00 2001 From: Steve Yegge Date: Tue, 9 Jul 2024 12:55:15 -0700 Subject: [PATCH 4/4] ran spotless --- src/main/kotlin/com/sourcegraph/config/ConfigUtil.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/sourcegraph/config/ConfigUtil.kt b/src/main/kotlin/com/sourcegraph/config/ConfigUtil.kt index 0a875b1235..a4aee9a4b1 100644 --- a/src/main/kotlin/com/sourcegraph/config/ConfigUtil.kt +++ b/src/main/kotlin/com/sourcegraph/config/ConfigUtil.kt @@ -16,10 +16,10 @@ import com.sourcegraph.cody.config.CodyAuthenticationManager import com.sourcegraph.cody.config.ServerAuthLoader import com.sourcegraph.cody.config.SourcegraphServerPath import com.sourcegraph.cody.config.SourcegraphServerPath.Companion.from -import org.jetbrains.annotations.Contract -import org.jetbrains.annotations.VisibleForTesting import java.nio.file.Path import java.nio.file.Paths +import org.jetbrains.annotations.Contract +import org.jetbrains.annotations.VisibleForTesting object ConfigUtil { const val DOTCOM_URL = "https://sourcegraph.com/" @@ -131,7 +131,8 @@ object ConfigUtil { @JvmStatic fun isCodyDebugEnabled(): Boolean = CodyApplicationSettings.instance.isCodyDebugEnabled - @JvmStatic fun isCodyUIHintsEnabled(): Boolean = CodyApplicationSettings.instance.isCodyUIHintsEnabled + @JvmStatic + fun isCodyUIHintsEnabled(): Boolean = CodyApplicationSettings.instance.isCodyUIHintsEnabled @JvmStatic fun isCodyVerboseDebugEnabled(): Boolean =