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)
if (extensions.isNotEmpty()) {
for (extension in extensions) {
if (extension.paint(this, g2d)) {
return
}
g2d.save()
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.ApplicationScope
import app.termora.account.AccountPlugin
import app.termora.plugin.internal.badge.BadgePlugin
import app.termora.plugin.internal.extension.DynamicExtensionPlugin
import app.termora.plugin.internal.local.LocalInternalPlugin
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))
// account plugin
plugins.add(PluginDescriptor(AccountPlugin(), origin = PluginOrigin.Internal, version = version))
// badge plugin
plugins.add(PluginDescriptor(BadgePlugin(), origin = PluginOrigin.Internal, version = version))
// ssh plugin
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
import app.termora.DynamicColor
import app.termora.setupAntialiasing
import com.formdev.flatlaf.extras.components.FlatButton
import com.formdev.flatlaf.ui.FlatButtonUI
import java.awt.Color
import java.awt.Graphics
import java.awt.Graphics2D
import javax.swing.JComponent
import javax.swing.UIManager
import kotlin.math.round
open class InstallButton : FlatButton() {
@@ -15,6 +18,7 @@ open class InstallButton : FlatButton() {
field = value
repaint()
}
var update = false
private var paintingBackground = false
@@ -44,6 +48,18 @@ open class InstallButton : FlatButton() {
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) {
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 updateButton = InstallButton()
private val updateButton = InstallButton().apply { update = true }
private val installButton = InstallButton()
private val uninstallButton = JButton(I18n.getString("termora.settings.plugin.uninstall"))