From 39e26a6e3d94d33c7519e56632f72bfc049d2701 Mon Sep 17 00:00:00 2001 From: hstyi Date: Fri, 25 Jul 2025 20:06:19 +0800 Subject: [PATCH] fix: keyword background color --- .../highlight/ChooseColorTemplateDialog.kt | 21 ++++++- .../app/termora/highlight/ColorPanel.kt | 7 +-- .../highlight/KeywordHighlightPanel.kt | 18 +++--- .../highlight/NewKeywordHighlightDialog.kt | 62 +++++++++++++++---- 4 files changed, 77 insertions(+), 31 deletions(-) diff --git a/src/main/kotlin/app/termora/highlight/ChooseColorTemplateDialog.kt b/src/main/kotlin/app/termora/highlight/ChooseColorTemplateDialog.kt index 229a3b0..e9c7224 100644 --- a/src/main/kotlin/app/termora/highlight/ChooseColorTemplateDialog.kt +++ b/src/main/kotlin/app/termora/highlight/ChooseColorTemplateDialog.kt @@ -1,6 +1,8 @@ package app.termora.highlight import app.termora.DialogWrapper +import app.termora.Disposable +import app.termora.Disposer import app.termora.TerminalFactory import com.formdev.flatlaf.util.SystemInfo import java.awt.* @@ -15,8 +17,9 @@ class ChooseColorTemplateDialog(owner: Window, title: String) : DialogWrapper(ow var colorIndex = -1 var defaultColor: Color = Color.white + var ok = false + init { - size = Dimension(UIManager.getInt("Dialog.width"), UIManager.getInt("Dialog.height")) isModal = true super.setTitle(title) controlsVisible = false @@ -30,11 +33,12 @@ class ChooseColorTemplateDialog(owner: Window, title: String) : DialogWrapper(ow override fun createCenterPanel(): JComponent { val panel = JPanel(GridLayout(2, 8, 4, 4)) - val colorPalette = TerminalFactory.getInstance() - .createTerminal().getTerminalModel().getColorPalette() + val terminal = TerminalFactory.getInstance().createTerminal() + val colorPalette = terminal.getTerminalModel().getColorPalette() for (i in 1..16) { val c = JPanel() c.preferredSize = Dimension(24, 24) + c.minimumSize = c.preferredSize c.background = Color(colorPalette.getXTerm256Color(i)) c.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { @@ -67,6 +71,12 @@ class ChooseColorTemplateDialog(owner: Window, title: String) : DialogWrapper(ow cPanel.add(panel, BorderLayout.CENTER) cPanel.add(customBtn, BorderLayout.SOUTH) cPanel.border = BorderFactory.createEmptyBorder(if (SystemInfo.isLinux) 6 else 0, 12, 12, 12) + + Disposer.register(disposable, object : Disposable { + override fun dispose() { + terminal.close() + } + }) return cPanel } @@ -74,4 +84,9 @@ class ChooseColorTemplateDialog(owner: Window, title: String) : DialogWrapper(ow override fun createSouthPanel(): JComponent? { return null } + + override fun doOKAction() { + ok = true + super.doOKAction() + } } \ No newline at end of file diff --git a/src/main/kotlin/app/termora/highlight/ColorPanel.kt b/src/main/kotlin/app/termora/highlight/ColorPanel.kt index 41cfe0a..c0f5f73 100644 --- a/src/main/kotlin/app/termora/highlight/ColorPanel.kt +++ b/src/main/kotlin/app/termora/highlight/ColorPanel.kt @@ -3,8 +3,8 @@ package app.termora.highlight import java.awt.Color import javax.swing.JPanel -class ColorPanel : JPanel { - var color: Color = Color.WHITE +class ColorPanel : JPanel() { + var color: Color? = null set(value) { background = value val old = field @@ -13,7 +13,4 @@ class ColorPanel : JPanel { } var colorIndex = -1 - constructor(color: Color) : super() { - this.color = color - } } \ No newline at end of file diff --git a/src/main/kotlin/app/termora/highlight/KeywordHighlightPanel.kt b/src/main/kotlin/app/termora/highlight/KeywordHighlightPanel.kt index 446758f..b8641bc 100644 --- a/src/main/kotlin/app/termora/highlight/KeywordHighlightPanel.kt +++ b/src/main/kotlin/app/termora/highlight/KeywordHighlightPanel.kt @@ -285,29 +285,27 @@ class KeywordHighlightPanel(private val accountOwner: AccountOwner) : JPanel(Bor dialog.keywordTextField.text = keywordHighlight.keyword dialog.descriptionTextField.text = keywordHighlight.description - if (keywordHighlight.textColor <= 16) { + if (keywordHighlight.textColor in 0..16) { if (keywordHighlight.textColor == 0) { - dialog.textColor.color = Color(colorPalette.getColor(TerminalColor.Basic.FOREGROUND)) + dialog.textColor.background = Color(colorPalette.getColor(TerminalColor.Basic.FOREGROUND)) + dialog.textColor.colorIndex = -1 } else { dialog.textColor.color = Color(colorPalette.getXTerm256Color(keywordHighlight.textColor)) + dialog.textColor.colorIndex = keywordHighlight.textColor } - dialog.textColor.colorIndex = keywordHighlight.textColor } else { dialog.textColor.color = Color(keywordHighlight.textColor) - dialog.textColor.colorIndex = -1 } - if (keywordHighlight.backgroundColor <= 16) { + if (keywordHighlight.backgroundColor in 0..16) { if (keywordHighlight.backgroundColor == 0) { - dialog.backgroundColor.color = Color(colorPalette.getColor(TerminalColor.Basic.BACKGROUND)) + dialog.backgroundColor.background = Color(colorPalette.getColor(TerminalColor.Basic.BACKGROUND)) + dialog.backgroundColor.colorIndex = -1 } else { dialog.backgroundColor.color = Color(colorPalette.getXTerm256Color(keywordHighlight.backgroundColor)) + dialog.backgroundColor.colorIndex = keywordHighlight.backgroundColor } - dialog.backgroundColor.colorIndex = keywordHighlight.backgroundColor - } else { - dialog.backgroundColor.color = Color(keywordHighlight.backgroundColor) - dialog.backgroundColor.colorIndex = -1 } dialog.boldCheckBox.isSelected = keywordHighlight.bold diff --git a/src/main/kotlin/app/termora/highlight/NewKeywordHighlightDialog.kt b/src/main/kotlin/app/termora/highlight/NewKeywordHighlightDialog.kt index ab50955..7aad961 100644 --- a/src/main/kotlin/app/termora/highlight/NewKeywordHighlightDialog.kt +++ b/src/main/kotlin/app/termora/highlight/NewKeywordHighlightDialog.kt @@ -23,6 +23,7 @@ import java.awt.event.MouseEvent import java.awt.event.WindowAdapter import java.awt.event.WindowEvent import javax.swing.* +import kotlin.math.max class NewKeywordHighlightDialog( owner: Window, @@ -95,7 +96,7 @@ class NewKeywordHighlightDialog( init() pack() - size = Dimension(UIManager.getInt("Dialog.width") - 200, height) + size = Dimension(UIManager.getInt("Dialog.width") - 200, max(height, preferredSize.height)) setLocationRelativeTo(null) } @@ -121,13 +122,15 @@ class NewKeywordHighlightDialog( lineThroughCheckBox.addActionListener { repaintKeywordHighlightView() } textColorRevert.addActionListener { - textColor.color = Color(colorPalette.getColor(TerminalColor.Basic.FOREGROUND)) - textColor.colorIndex = 0 + textColor.color = null + textColor.background = Color(colorPalette.getColor(TerminalColor.Basic.FOREGROUND)) + textColor.colorIndex = -1 repaintKeywordHighlightView() } backgroundColorRevert.addActionListener { - backgroundColor.color = Color(colorPalette.getColor(TerminalColor.Basic.BACKGROUND)) - backgroundColor.colorIndex = 0 + backgroundColor.color = null + backgroundColor.background = Color(colorPalette.getColor(TerminalColor.Basic.BACKGROUND)) + backgroundColor.colorIndex = -1 repaintKeywordHighlightView() } @@ -145,8 +148,22 @@ class NewKeywordHighlightDialog( keywordHighlightView.italic = italicCheckBox.isSelected keywordHighlightView.underline = underlineCheckBox.isSelected keywordHighlightView.lineThrough = lineThroughCheckBox.isSelected - keywordHighlightView.textColor = textColor.color - keywordHighlightView.backgroundColor = backgroundColor.color + + if (textColor.color == null && textColor.colorIndex == -1) { + keywordHighlightView.textColor = Color(colorPalette.getColor(TerminalColor.Basic.FOREGROUND)) + } else if (textColor.color != null) { + keywordHighlightView.textColor = textColor.color + } else { + keywordHighlightView.textColor = Color(colorPalette.getXTerm256Color(textColor.colorIndex)) + } + + if (backgroundColor.color == null && backgroundColor.colorIndex == -1) { + keywordHighlightView.backgroundColor = Color(colorPalette.getColor(TerminalColor.Basic.BACKGROUND)) + } else if (backgroundColor.color != null) { + keywordHighlightView.backgroundColor = backgroundColor.color + } else { + keywordHighlightView.backgroundColor = Color(colorPalette.getXTerm256Color(backgroundColor.colorIndex)) + } keywordHighlightView.repaint() } @@ -192,7 +209,8 @@ class NewKeywordHighlightDialog( val owner = this val arc = UIManager.getInt("Component.arc") val lineBorder = FlatLineBorder(Insets(1, 1, 1, 1), DynamicColor.BorderColor, 1f, arc) - val colorPanel = ColorPanel(color) + val colorPanel = ColorPanel() + colorPanel.background = color colorPanel.preferredSize = keywordTextField.preferredSize colorPanel.border = lineBorder colorPanel.addMouseListener(object : MouseAdapter() { @@ -200,10 +218,19 @@ class NewKeywordHighlightDialog( if (SwingUtilities.isLeftMouseButton(e)) { val dialog = ChooseColorTemplateDialog(owner, title) dialog.setLocationRelativeTo(owner) - dialog.defaultColor = colorPanel.color + dialog.defaultColor = colorPanel.color ?: Color.orange dialog.isVisible = true - colorPanel.color = dialog.color ?: return - colorPanel.colorIndex = dialog.colorIndex + if (dialog.ok.not()) return + + colorPanel.colorIndex = -1 + colorPanel.color = null + if (dialog.colorIndex in 1..16) { + colorPanel.colorIndex = dialog.colorIndex + colorPanel.background = Color(colorPalette.getXTerm256Color(dialog.colorIndex)) + } else { + colorPanel.color = dialog.color + } + repaintKeywordHighlightView() } } }) @@ -218,13 +245,22 @@ class NewKeywordHighlightDialog( } + val newTextColor = if (textColor.color != null) textColor.color?.toRGB() ?: 0 + else if (textColor.colorIndex == -1) 0 + else textColor.colorIndex + + + val newBackgroundColor = if (backgroundColor.color != null) backgroundColor.color?.toRGB() ?: 0 + else if (backgroundColor.colorIndex == -1) 0 + else backgroundColor.colorIndex + keywordHighlight = KeywordHighlight( keyword = keywordTextField.text, description = descriptionTextField.text, matchCase = matchCaseBtn.isSelected, regex = regexBtn.isSelected, - textColor = if (textColor.colorIndex != -1) textColor.colorIndex else textColor.color.toRGB(), - backgroundColor = if (backgroundColor.colorIndex != -1) backgroundColor.colorIndex else backgroundColor.color.toRGB(), + textColor = newTextColor, + backgroundColor = newBackgroundColor, bold = boldCheckBox.isSelected, italic = italicCheckBox.isSelected, lineThrough = lineThroughCheckBox.isSelected,