chore: add a badge to the plugin update button

This commit is contained in:
hstyi
2025-06-16 10:12:13 +08:00
committed by hstyi
parent 40b4848cc8
commit b4e82a4a0e
6 changed files with 64 additions and 4 deletions

View File

@@ -0,0 +1,18 @@
package app.termora
import java.awt.Graphics2D
import javax.swing.JComponent
class BadgeGlassPaneExtension private constructor() : GlassPaneExtension {
companion object {
val instance = BadgeGlassPaneExtension()
}
override fun paint(c: JComponent, g2d: Graphics2D): Boolean {
return false
}
override fun ordered(): Long {
return 0
}
}

View File

@@ -276,9 +276,10 @@ class TermoraFrame : JFrame(), DataProvider {
.getExtensions(GlassPaneExtension::class.java) .getExtensions(GlassPaneExtension::class.java)
if (extensions.isNotEmpty()) { if (extensions.isNotEmpty()) {
for (extension in extensions) { for (extension in extensions) {
if (extension.paint(this, g2d)) { g2d.save()
return val painted = extension.paint(this, g2d)
} g2d.restore()
if (painted) break
} }
} }
} }

View File

@@ -3,6 +3,7 @@ package app.termora.plugin
import app.termora.Application import app.termora.Application
import app.termora.ApplicationScope import app.termora.ApplicationScope
import app.termora.account.AccountPlugin import app.termora.account.AccountPlugin
import app.termora.plugin.internal.badge.BadgePlugin
import app.termora.plugin.internal.extension.DynamicExtensionPlugin import app.termora.plugin.internal.extension.DynamicExtensionPlugin
import app.termora.plugin.internal.local.LocalInternalPlugin import app.termora.plugin.internal.local.LocalInternalPlugin
import app.termora.plugin.internal.plugin.PluginInternalPlugin import app.termora.plugin.internal.plugin.PluginInternalPlugin
@@ -103,6 +104,8 @@ internal class PluginManager private constructor() {
plugins.add(PluginDescriptor(PluginInternalPlugin(), origin = PluginOrigin.Internal, version = version)) plugins.add(PluginDescriptor(PluginInternalPlugin(), origin = PluginOrigin.Internal, version = version))
// account plugin // account plugin
plugins.add(PluginDescriptor(AccountPlugin(), origin = PluginOrigin.Internal, version = version)) plugins.add(PluginDescriptor(AccountPlugin(), origin = PluginOrigin.Internal, version = version))
// badge plugin
plugins.add(PluginDescriptor(BadgePlugin(), origin = PluginOrigin.Internal, version = version))
// ssh plugin // ssh plugin
plugins.add(PluginDescriptor(SSHInternalPlugin(), origin = PluginOrigin.Internal, version = version)) plugins.add(PluginDescriptor(SSHInternalPlugin(), origin = PluginOrigin.Internal, version = version))

View File

@@ -0,0 +1,22 @@
package app.termora.plugin.internal.badge
import app.termora.BadgeGlassPaneExtension
import app.termora.GlassPaneExtension
import app.termora.plugin.Extension
import app.termora.plugin.InternalPlugin
internal class BadgePlugin : InternalPlugin() {
init {
support.addExtension(GlassPaneExtension::class.java) { BadgeGlassPaneExtension.instance }
}
override fun getName(): String {
return "Badge"
}
override fun <T : Extension> getExtensions(clazz: Class<T>): List<T> {
return support.getExtensions(clazz)
}
}

View File

@@ -1,11 +1,14 @@
package app.termora.plugin.internal.plugin package app.termora.plugin.internal.plugin
import app.termora.DynamicColor import app.termora.DynamicColor
import app.termora.setupAntialiasing
import com.formdev.flatlaf.extras.components.FlatButton import com.formdev.flatlaf.extras.components.FlatButton
import com.formdev.flatlaf.ui.FlatButtonUI import com.formdev.flatlaf.ui.FlatButtonUI
import java.awt.Color import java.awt.Color
import java.awt.Graphics import java.awt.Graphics
import java.awt.Graphics2D
import javax.swing.JComponent import javax.swing.JComponent
import javax.swing.UIManager
import kotlin.math.round import kotlin.math.round
open class InstallButton : FlatButton() { open class InstallButton : FlatButton() {
@@ -15,6 +18,7 @@ open class InstallButton : FlatButton() {
field = value field = value
repaint() repaint()
} }
var update = false
private var paintingBackground = false private var paintingBackground = false
@@ -44,6 +48,18 @@ open class InstallButton : FlatButton() {
return super.getText() return super.getText()
} }
override fun paint(g: Graphics?) {
super.paint(g)
if (g is Graphics2D) {
setupAntialiasing(g)
if (update && installing.not()) {
val size = 6
g.color = UIManager.getColor("Component.error.focusedBorderColor")
g.fillRoundRect(width - size - 4, 4, size, size, size, size)
}
}
}
private inner class InstallButtonUI : FlatButtonUI(true) { private inner class InstallButtonUI : FlatButtonUI(true) {
override fun paintBackground(g: Graphics?, c: JComponent?) { override fun paintBackground(g: Graphics?, c: JComponent?) {

View File

@@ -38,7 +38,7 @@ class PluginPanel(val descriptor: PluginPluginDescriptor) : JPanel(), Disposable
} }
private val restartButton = JButton(I18n.getString("termora.settings.restart.title")) private val restartButton = JButton(I18n.getString("termora.settings.restart.title"))
private val updateButton = InstallButton() private val updateButton = InstallButton().apply { update = true }
private val installButton = InstallButton() private val installButton = InstallButton()
private val uninstallButton = JButton(I18n.getString("termora.settings.plugin.uninstall")) private val uninstallButton = JButton(I18n.getString("termora.settings.plugin.uninstall"))