diff --git a/src/main/kotlin/app/termora/BadgeGlassPaneExtension.kt b/src/main/kotlin/app/termora/BadgeGlassPaneExtension.kt new file mode 100644 index 0000000..6ee339c --- /dev/null +++ b/src/main/kotlin/app/termora/BadgeGlassPaneExtension.kt @@ -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 + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/termora/TermoraFrame.kt b/src/main/kotlin/app/termora/TermoraFrame.kt index a5d722d..32b5fa9 100644 --- a/src/main/kotlin/app/termora/TermoraFrame.kt +++ b/src/main/kotlin/app/termora/TermoraFrame.kt @@ -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 } } } diff --git a/src/main/kotlin/app/termora/plugin/PluginManager.kt b/src/main/kotlin/app/termora/plugin/PluginManager.kt index 0ffd603..f863fbc 100644 --- a/src/main/kotlin/app/termora/plugin/PluginManager.kt +++ b/src/main/kotlin/app/termora/plugin/PluginManager.kt @@ -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)) diff --git a/src/main/kotlin/app/termora/plugin/internal/badge/BadgePlugin.kt b/src/main/kotlin/app/termora/plugin/internal/badge/BadgePlugin.kt new file mode 100644 index 0000000..a3c7a7b --- /dev/null +++ b/src/main/kotlin/app/termora/plugin/internal/badge/BadgePlugin.kt @@ -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 getExtensions(clazz: Class): List { + return support.getExtensions(clazz) + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/termora/plugin/internal/plugin/InstallButton.kt b/src/main/kotlin/app/termora/plugin/internal/plugin/InstallButton.kt index 5405608..cbee066 100644 --- a/src/main/kotlin/app/termora/plugin/internal/plugin/InstallButton.kt +++ b/src/main/kotlin/app/termora/plugin/internal/plugin/InstallButton.kt @@ -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?) { diff --git a/src/main/kotlin/app/termora/plugin/internal/plugin/PluginPanel.kt b/src/main/kotlin/app/termora/plugin/internal/plugin/PluginPanel.kt index 55d8ac1..939844a 100644 --- a/src/main/kotlin/app/termora/plugin/internal/plugin/PluginPanel.kt +++ b/src/main/kotlin/app/termora/plugin/internal/plugin/PluginPanel.kt @@ -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"))