Skip to content

Commit 308e1d9

Browse files
authored
CodeWhisperer: Simplify Learn UX (#3996)
* CodeWhisperer: Simplify Learn UX Remove other sections expect for generate suggestion, and only use Java as the example and 3 types of tasks * Remove banner component * change text
1 parent 793d3a6 commit 308e1d9

File tree

8 files changed

+19
-620
lines changed

8 files changed

+19
-620
lines changed

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/CodeWhispererExplorerActionManager.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,6 @@ class CodeWhispererExplorerActionManager : PersistentStateComponent<CodeWhispere
5656
actionState.value[CodeWhispererExploreStateType.IsAutoEnabled] = isAutoEnabled
5757
}
5858

59-
fun hasShownOldOnboardingPage(): Boolean = actionState.value.getOrDefault(CodeWhispererExploreStateType.HasShownHowToUseCodeWhisperer, false)
60-
61-
fun hasShownNewOnboardingPage(): Boolean = actionState.value.getOrDefault(CodeWhispererExploreStateType.HasShownNewOnboardingPage, false)
62-
6359
fun setHasShownNewOnboardingPage(hasShownNewOnboardingPage: Boolean) {
6460
actionState.value[CodeWhispererExploreStateType.HasShownNewOnboardingPage] = hasShownNewOnboardingPage
6561
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/learn/LearnCodeWhispererEditor.kt

Lines changed: 6 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -9,51 +9,27 @@ import com.intellij.openapi.fileEditor.FileEditorLocation
99
import com.intellij.openapi.fileEditor.FileEditorState
1010
import com.intellij.openapi.fileEditor.FileEditorStateLevel
1111
import com.intellij.openapi.project.Project
12-
import com.intellij.openapi.ui.OnePixelDivider
1312
import com.intellij.openapi.util.UserDataHolderBase
1413
import com.intellij.openapi.vfs.VirtualFile
15-
import com.intellij.ui.JBColor
16-
import com.intellij.ui.SeparatorComponent
1714
import com.intellij.ui.dsl.builder.Align
18-
import com.intellij.ui.dsl.builder.AlignX
1915
import com.intellij.ui.dsl.builder.AlignY
2016
import com.intellij.ui.dsl.builder.BottomGap
21-
import com.intellij.ui.dsl.builder.Cell
2217
import com.intellij.ui.dsl.builder.Panel
23-
import com.intellij.ui.dsl.builder.Row
2418
import com.intellij.ui.dsl.builder.TopGap
2519
import com.intellij.ui.dsl.builder.panel
2620
import com.intellij.ui.dsl.gridLayout.Gaps
2721
import icons.AwsIcons
28-
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
29-
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererCsharp
30-
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererJava
31-
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererJavaScript
32-
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererPython
33-
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererTypeScript
34-
import software.aws.toolkits.jetbrains.services.codewhisperer.learn.LearnCodeWhispererEditorProvider.Companion.NEW_ONBOARDING_UX_KEY
35-
import software.aws.toolkits.jetbrains.services.codewhisperer.learn.LearnCodeWhispererUIComponents.bannerPanel
36-
import software.aws.toolkits.jetbrains.services.codewhisperer.learn.LearnCodeWhispererUIComponents.codeScanDescriptionPanel
37-
import software.aws.toolkits.jetbrains.services.codewhisperer.learn.LearnCodeWhispererUIComponents.commandsPanel
3822
import software.aws.toolkits.jetbrains.services.codewhisperer.learn.LearnCodeWhispererUIComponents.examplesDescriptionPanel
39-
import software.aws.toolkits.jetbrains.services.codewhisperer.learn.LearnCodeWhispererUIComponents.resourcesPanel
4023
import software.aws.toolkits.jetbrains.services.codewhisperer.learn.LearnCodeWhispererUIComponents.tryExamplePanel
41-
import software.aws.toolkits.jetbrains.services.codewhisperer.learn.LearnCodeWhispererUIComponents.workshopPanel
4224
import software.aws.toolkits.resources.message
43-
import java.awt.Font
4425
import java.beans.PropertyChangeListener
45-
import javax.swing.BorderFactory
46-
import javax.swing.ImageIcon
47-
import javax.swing.JButton
4826
import javax.swing.JComponent
49-
import javax.swing.JPanel
5027

5128
class LearnCodeWhispererEditor(val project: Project, val virtualFile: VirtualFile) : UserDataHolderBase(), FileEditor {
52-
private val languageButtons = mutableListOf<Cell<JButton>>()
5329
private val contentPanel = panel {
5430
row {
5531
panel {
56-
customize(Gaps(0, 50, 0, 0))
32+
customize(Gaps(20, 50, 0, 0))
5733
row {
5834
icon(AwsIcons.Logos.CODEWHISPERER_LARGE)
5935

@@ -68,77 +44,22 @@ class LearnCodeWhispererEditor(val project: Project, val virtualFile: VirtualFil
6844
}.topGap(TopGap.MEDIUM).bottomGap(BottomGap.MEDIUM)
6945

7046
row {
71-
// Left panel
47+
// Single panel
7248
panel {
7349
customize(Gaps(0, 50, 0, 0))
7450
align(AlignY.TOP)
75-
addToLeftPanel(commandsPanel(project))
76-
addToLeftPanel(workshopPanel())
77-
addToLeftPanel(resourcesPanel(project))
78-
}
7951

80-
// Right panel
81-
panel {
82-
customize(Gaps(0, 40, 50, 60))
83-
align(AlignY.TOP)
84-
85-
title(message("codewhisperer.learn_page.examples.title"))
52+
title(message("codewhisperer.learn_page.examples.title")).bottomGap(BottomGap.MEDIUM)
8653
row {
87-
cell(examplesDescriptionPanel)
54+
cell(tryExamplePanel(project)).widthGroup(FIRST_COLUMN_WIDTH_GROUP)
8855
}.bottomGap(BottomGap.MEDIUM)
89-
buttonsGroup {
90-
row {
91-
val javaButton = learnCodeWhispererLanguageButton(CodeWhispererJava.INSTANCE)
92-
val pythonButton = learnCodeWhispererLanguageButton(CodeWhispererPython.INSTANCE)
93-
val javascriptButton = learnCodeWhispererLanguageButton(CodeWhispererJavaScript.INSTANCE)
94-
val typescriptButton = learnCodeWhispererLanguageButton(CodeWhispererTypeScript.INSTANCE)
95-
val csharpButton = learnCodeWhispererLanguageButton(CodeWhispererCsharp.INSTANCE)
96-
languageButtons.add(javaButton)
97-
languageButtons.add(pythonButton)
98-
languageButtons.add(javascriptButton)
99-
languageButtons.add(typescriptButton)
100-
languageButtons.add(csharpButton)
101-
javaButton.component.doClick()
102-
}.bottomGap(BottomGap.MEDIUM)
103-
}
10456
row {
105-
cell(tryExamplePanel(project)).widthGroup(RIGHT_PANEL_WIDTH_GROUP)
57+
cell(examplesDescriptionPanel).widthGroup(FIRST_COLUMN_WIDTH_GROUP)
10658
}.bottomGap(BottomGap.MEDIUM)
107-
108-
// A separator with width adjusted to its sibling components
109-
row {
110-
cell(SeparatorComponent(0, OnePixelDivider.BACKGROUND, null))
111-
.widthGroup(RIGHT_PANEL_WIDTH_GROUP)
112-
}.bottomGap(BottomGap.MEDIUM)
113-
114-
title(message("codewhisperer.learn_page.codescan.title"))
115-
row {
116-
cell(codeScanDescriptionPanel)
117-
}.bottomGap(BottomGap.SMALL)
118-
row {
119-
icon(ImageIcon(LearnCodeWhispererUIComponents.javaClass.classLoader.getResource("codewhisperer/codescan.png")))
120-
.widthGroup(RIGHT_PANEL_WIDTH_GROUP).align(AlignX.LEFT)
121-
}
12259
}
12360
}
12461
}
125-
private val banner = panel {
126-
panel {
127-
customize(Gaps(10, 20, 10, 10))
128-
row {
129-
cell(bannerPanel()).resizableColumn().align(Align.FILL)
130-
}
131-
}
132-
}.apply {
133-
background = JBColor.BLUE.darker().darker()
134-
}
13562
private val rootPanel = panel {
136-
val hasUserSeenNewUX = virtualFile.getUserData(NEW_ONBOARDING_UX_KEY) ?: false
137-
if (!hasUserSeenNewUX) {
138-
row {
139-
cell(banner).resizableColumn().align(Align.FILL)
140-
}
141-
}
14263
row {
14364
scrollCell(contentPanel).align(Align.FILL)
14465
}.resizableRow()
@@ -174,52 +95,11 @@ class LearnCodeWhispererEditor(val project: Project, val virtualFile: VirtualFil
17495

17596
override fun getFile(): VirtualFile = virtualFile
17697

177-
private fun Row.learnCodeWhispererLanguageButton(buttonLanguage: CodeWhispererProgrammingLanguage): Cell<JButton> {
178-
val buttonContext = when (buttonLanguage) {
179-
CodeWhispererJava.INSTANCE -> "Java " to AwsIcons.Misc.JAVA
180-
CodeWhispererPython.INSTANCE -> "Python " to AwsIcons.Misc.PYTHON
181-
CodeWhispererJavaScript.INSTANCE -> "JavaScript " to AwsIcons.Misc.JAVASCRIPT
182-
CodeWhispererTypeScript.INSTANCE -> "TypeScript " to AwsIcons.Misc.TYPESCRIPT
183-
CodeWhispererCsharp.INSTANCE -> "C# " to AwsIcons.Misc.CSHARP
184-
else -> "Java " to AwsIcons.Misc.JAVA
185-
}
186-
val text = buttonContext.first
187-
val buttonIcon = buttonContext.second
188-
189-
return button(text) {
190-
LearnCodeWhispererManager.getInstance(project).language = buttonLanguage
191-
languageButtons.forEach { button ->
192-
button.applyToComponent {
193-
border = BorderFactory.createEmptyBorder(3, 3, 3, 3)
194-
font = font.deriveFont(Font.PLAIN)
195-
}
196-
}
197-
languageButtons.filter { button -> button.component.text == text }[0].applyToComponent {
198-
border = BorderFactory.createCompoundBorder(
199-
CustomRadiusRoundedBorder(1, 30, JBColor.BLUE),
200-
BorderFactory.createEmptyBorder(2, 2, 2, 2)
201-
)
202-
font = font.deriveFont(Font.BOLD)
203-
}
204-
}.applyToComponent {
205-
icon = buttonIcon
206-
isOpaque = false
207-
isContentAreaFilled = false
208-
border = BorderFactory.createEmptyBorder(3, 3, 3, 3)
209-
isSelected = LearnCodeWhispererManager.getInstance(project).language == buttonLanguage
210-
}.customize(Gaps(0, 10, 2, 10))
211-
}
212-
21398
private fun Panel.title(text: String) = row {
21499
label(text).bold().applyToComponent { font = font.deriveFont(24f) }
215100
}
216101

217-
private fun Panel.addToLeftPanel(panel: JPanel) = row {
218-
cell(panel).widthGroup(LEFT_PANEL_WIDTH_GROUP).customize(Gaps(22, 18, 11, 18))
219-
}.bottomGap(BottomGap.MEDIUM)
220-
221102
companion object {
222-
private const val LEFT_PANEL_WIDTH_GROUP = "leftPanel"
223-
private const val RIGHT_PANEL_WIDTH_GROUP = "rightPanel"
103+
private const val FIRST_COLUMN_WIDTH_GROUP = "firstColumn"
224104
}
225105
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/learn/LearnCodeWhispererEditorProvider.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.intellij.openapi.fileEditor.FileEditorProvider
1111
import com.intellij.openapi.fileEditor.OpenFileDescriptor
1212
import com.intellij.openapi.project.DumbAware
1313
import com.intellij.openapi.project.Project
14-
import com.intellij.openapi.util.Key
1514
import com.intellij.openapi.vfs.VirtualFile
1615
import software.aws.toolkits.core.utils.debug
1716
import software.aws.toolkits.core.utils.getLogger
@@ -30,19 +29,13 @@ class LearnCodeWhispererEditorProvider : FileEditorProvider, DumbAware {
3029

3130
companion object {
3231
private val LOG = getLogger<LearnCodeWhispererEditorProvider>()
33-
val NEW_ONBOARDING_UX_KEY = Key.create<Boolean>("NEW_ONBOARDING_UX")
3432

3533
// Will be called every time the getting started page is opened
3634
fun openEditor(project: Project) {
3735
if (isRunningOnRemoteBackend()) return
3836

3937
val virtualFile = LearnCodeWhispererVirtualFile()
4038

41-
// The "hasShown" status will be passed as local states to the page rendering process each time
42-
virtualFile.putUserData(
43-
NEW_ONBOARDING_UX_KEY,
44-
CodeWhispererExplorerActionManager.getInstance().hasShownNewOnboardingPage()
45-
)
4639
runInEdt {
4740
try {
4841
FileEditorManager.getInstance(project).openFileEditor(OpenFileDescriptor(project, virtualFile), true)

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/learn/LearnCodeWhispererManager.kt

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,53 +7,22 @@ import com.intellij.openapi.components.service
77
import com.intellij.openapi.project.Project
88
import com.intellij.openapi.vfs.VirtualFile
99
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
10-
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererCsharp
1110
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererJava
12-
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererJavaScript
13-
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererPython
14-
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererTypeScript
15-
import software.aws.toolkits.resources.message
1611
import software.aws.toolkits.telemetry.CodewhispererGettingStartedTask
17-
import javax.swing.JButton
1812

1913
class LearnCodeWhispererManager(private val project: Project) {
20-
val tryExampleButtons = mutableListOf<JButton>()
21-
var language: CodeWhispererProgrammingLanguage = CodeWhispererJava.INSTANCE
22-
set(value) {
23-
field = value
24-
tryExampleButtons.forEach {
25-
it.text = message("codewhisperer.learn_page.examples.tasks.button", getButtonSuffix())
26-
}
27-
}
14+
// Only supporting Java at the moment
15+
val language: CodeWhispererProgrammingLanguage = CodeWhispererJava.INSTANCE
16+
val fileExtension = ".java"
2817

2918
fun getEditor(file: VirtualFile) = LearnCodeWhispererEditor(project, file)
3019

31-
fun getFileExtension() = when (language) {
32-
CodeWhispererJava.INSTANCE -> ".java"
33-
CodeWhispererPython.INSTANCE -> ".py"
34-
CodeWhispererJavaScript.INSTANCE -> ".js"
35-
CodeWhispererTypeScript.INSTANCE -> ".ts"
36-
CodeWhispererCsharp.INSTANCE -> ".cs"
37-
else -> ".java"
38-
}
39-
40-
fun getButtonSuffix() = when (language) {
41-
CodeWhispererJava.INSTANCE -> "Java"
42-
CodeWhispererPython.INSTANCE -> "Python"
43-
CodeWhispererJavaScript.INSTANCE -> "JavaScript"
44-
CodeWhispererTypeScript.INSTANCE -> "TypeScript"
45-
CodeWhispererCsharp.INSTANCE -> "C#"
46-
else -> "Java"
47-
}
48-
4920
companion object {
5021
fun getInstance(project: Project) = project.service<LearnCodeWhispererManager>()
5122
val taskTypeToFilename = mapOf(
5223
CodewhispererGettingStartedTask.AutoTrigger to "CodeWhisperer_generate_suggestion",
5324
CodewhispererGettingStartedTask.ManualTrigger to "CodeWhisperer_manual_invoke",
54-
CodewhispererGettingStartedTask.CommentAsPrompt to "CodeWhisperer_use_comments",
5525
CodewhispererGettingStartedTask.UnitTest to "CodeWhisperer_generate_unit_tests",
56-
CodewhispererGettingStartedTask.Navigation to "CodeWhisperer_navigate_suggestions",
5726
)
5827
}
5928
}

0 commit comments

Comments
 (0)