Skip to content

Commit ca98448

Browse files
committed
feat(terminal): add collapsible panel for shell code display #335
Introduce a new `CollapsiblePanel` component to toggle visibility of shell code in the terminal sketch. This improves UI by allowing users to collapse/expand code sections, enhancing the overall user experience.
1 parent 5f98083 commit ca98448

File tree

2 files changed

+49
-13
lines changed

2 files changed

+49
-13
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package cc.unitmesh.terminal.sketch
2+
3+
import com.intellij.ui.components.JBLabel
4+
import com.intellij.ui.components.JBPanel
5+
import com.intellij.util.ui.JBUI
6+
import java.awt.BorderLayout
7+
import java.awt.Cursor
8+
import java.awt.event.MouseAdapter
9+
import java.awt.event.MouseEvent
10+
import javax.swing.JPanel
11+
12+
class CollapsiblePanel(title: String, content: JPanel) : JBPanel<CollapsiblePanel>(BorderLayout()) {
13+
private var isCollapsed = false
14+
private val headerPanel = JBPanel<JBPanel<*>>(BorderLayout())
15+
private val titleLabel = JBLabel(title)
16+
private val toggleLabel = JBLabel("") // Unicode arrow: ▼ for expanded, ► for collapsed
17+
18+
init {
19+
headerPanel.border = JBUI.Borders.empty(5)
20+
headerPanel.add(titleLabel, BorderLayout.CENTER)
21+
headerPanel.add(toggleLabel, BorderLayout.EAST)
22+
headerPanel.cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)
23+
24+
headerPanel.addMouseListener(object : MouseAdapter() {
25+
override fun mouseClicked(e: MouseEvent?) {
26+
toggleContent(content)
27+
}
28+
})
29+
30+
add(headerPanel, BorderLayout.NORTH)
31+
add(content, BorderLayout.CENTER)
32+
}
33+
34+
private fun toggleContent(content: JPanel) {
35+
isCollapsed = !isCollapsed
36+
content.isVisible = !isCollapsed
37+
toggleLabel.text = if (isCollapsed) "" else ""
38+
revalidate()
39+
repaint()
40+
}
41+
}

exts/ext-terminal/src/main/kotlin/cc/unitmesh/terminal/sketch/TerminalSketchProvider.kt

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// File: TerminalSketchProvider.kt
12
package cc.unitmesh.terminal.sketch
23

34
import cc.unitmesh.devti.AutoDevIcons
@@ -40,9 +41,6 @@ import javax.swing.JComponent
4041
import javax.swing.JLabel
4142
import javax.swing.JPanel
4243

43-
/**
44-
* TerminalSketch provide a support for `bash` and `shell` language in terminal.
45-
*/
4644
class TerminalSketchProvider : LanguageSketchProvider {
4745
override fun isSupported(lang: String): Boolean = lang == "bash" || lang == "shell"
4846

@@ -61,6 +59,10 @@ class TerminalSketchProvider : LanguageSketchProvider {
6159
}
6260

6361
val codeSketch = CodeHighlightSketch(project, content, CodeFence.findLanguage("bash"))
62+
val codePanel = JPanel(BorderLayout()).apply {
63+
add(codeSketch.getComponent(), BorderLayout.CENTER)
64+
}
65+
val collapsibleCodePanel = CollapsiblePanel("Shell Code", codePanel)
6466

6567
val toolbarPanel = JPanel(BorderLayout()).apply {
6668
add(titleLabel, BorderLayout.WEST)
@@ -83,7 +85,7 @@ class TerminalSketchProvider : LanguageSketchProvider {
8385
mainPanel = object : JPanel(VerticalLayout(JBUI.scale(0))) {
8486
init {
8587
add(toolbarWrapper)
86-
add(codeSketch.getComponent())
88+
add(collapsibleCodePanel)
8789
add(terminalWidget!!.component)
8890
}
8991
}
@@ -176,22 +178,16 @@ class TerminalSketchProvider : LanguageSketchProvider {
176178
}
177179

178180
override fun onDoneStream(allText: String) {
179-
var isAlreadySent = false
180181
if (content.lines().size > 1) return
181182

182183
titleLabel.text = "Terminal - ($content)"
183-
184184
ApplicationManager.getApplication().invokeLater {
185185
terminalWidget!!.terminalStarter?.sendString(content, false)
186186
}
187-
188-
isAlreadySent = true
189187
}
190188

191189
override fun getComponent(): JComponent = mainPanel!!
192-
193190
override fun updateLanguage(language: Language?, originLanguage: String?) {}
194-
195191
override fun dispose() {
196192
codeSketch.dispose()
197193
}
@@ -225,7 +221,7 @@ class FrontendWebViewServerFilter(val project: Project, val mainPanel: JPanel) :
225221
loadURL(url)
226222
}
227223

228-
var additionalPanel = JPanel(BorderLayout()).apply {
224+
val additionalPanel = JPanel(BorderLayout()).apply {
229225
add(webViewWindow.component, BorderLayout.CENTER)
230226
}
231227

@@ -235,7 +231,6 @@ class FrontendWebViewServerFilter(val project: Project, val mainPanel: JPanel) :
235231
}
236232

237233
isAlreadyStart = true
238-
239234
return null
240235
}
241-
}
236+
}

0 commit comments

Comments
 (0)