From a0993d66e393314e9d60d3ab6f530b2e5281505a Mon Sep 17 00:00:00 2001 From: Phodal Huang Date: Sat, 13 Jan 2024 10:35:06 +0800 Subject: [PATCH] feat(statusbar): add AutoDevStatusId to AutoDevStatusBarWidget This commit adds the AutoDevStatusId property to the AutoDevStatusBarWidget class in order to identify the status bar widget. This allows for easier updating of the widget when the status changes. --- .../devti/statusbar/AutoDevStatusBarWidget.kt | 20 +++++++++--- .../devti/statusbar/AutoDevStatusService.kt | 31 +++++++++++++++++++ .../messages/AutoDevBundle.properties | 1 + 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/cc/unitmesh/devti/statusbar/AutoDevStatusBarWidget.kt b/src/main/kotlin/cc/unitmesh/devti/statusbar/AutoDevStatusBarWidget.kt index bad0715b14..1b31b2252c 100644 --- a/src/main/kotlin/cc/unitmesh/devti/statusbar/AutoDevStatusBarWidget.kt +++ b/src/main/kotlin/cc/unitmesh/devti/statusbar/AutoDevStatusBarWidget.kt @@ -11,17 +11,16 @@ import com.intellij.openapi.ui.popup.JBPopupFactory import com.intellij.openapi.ui.popup.ListPopup import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.wm.StatusBarWidget +import com.intellij.openapi.wm.WindowManager import com.intellij.openapi.wm.impl.status.EditorBasedStatusBarPopup class AutoDevStatusBarWidget(project: Project) : EditorBasedStatusBarPopup(project, false) { - override fun ID(): String = "AutoDev" + override fun ID(): String = AutoDevBundle.message("autodev.statusbar.id") override fun createInstance(project: Project): StatusBarWidget { return AutoDevStatusBarWidget(project) } override fun createPopup(context: DataContext): ListPopup? { -// TODO: show different status in menu -// val currentStatus = AutoDevStatusService.currentStatus.first val statusGroup = DefaultActionGroup() val configuredGroup = ActionManager.getInstance().getAction("autodev.statusBarPopup") as? ActionGroup @@ -39,11 +38,24 @@ class AutoDevStatusBarWidget(project: Project) : EditorBasedStatusBarPopup(proje override fun getWidgetState(file: VirtualFile?): WidgetState { val widgetState = WidgetState("", "", true) - widgetState.icon = AutoDevIcons.AI_COPILOT + val currentStatus = AutoDevStatusService.currentStatus.first + widgetState.icon = currentStatus.icon return widgetState } override fun dispose() { super.dispose() } + + companion object { + fun update(project: Project) { + val bar = WindowManager.getInstance().getStatusBar(project) + val barWidget = + bar.getWidget(AutoDevBundle.message("autodev.statusbar.id")) as? AutoDevStatusBarWidget ?: return + + barWidget.update { + barWidget.myStatusBar?.updateWidget(AutoDevBundle.message("autodev.statusbar.id")) + } + } + } } diff --git a/src/main/kotlin/cc/unitmesh/devti/statusbar/AutoDevStatusService.kt b/src/main/kotlin/cc/unitmesh/devti/statusbar/AutoDevStatusService.kt index 40e77d826b..9e024d30a3 100644 --- a/src/main/kotlin/cc/unitmesh/devti/statusbar/AutoDevStatusService.kt +++ b/src/main/kotlin/cc/unitmesh/devti/statusbar/AutoDevStatusService.kt @@ -2,6 +2,7 @@ package cc.unitmesh.devti.statusbar import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.util.Pair import com.intellij.util.messages.Topic import io.opentelemetry.api.internal.GuardedBy @@ -30,11 +31,41 @@ class AutoDevStatusService : Disposable { synchronized(lock) { return Pair.create(status, message) } } + fun onCopilotStatus(status: AutoDevStatus, customMessage: String?) { + synchronized(lock) { + this.status = status + message = customMessage + } + + updateAllStatusBarIcons() + } + + private fun updateAllStatusBarIcons() { + val action = Runnable { + ProjectManager.getInstance().openProjects + .filterNot { it.isDisposed } + .forEach { AutoDevStatusBarWidget.update(it) } + } + val application = ApplicationManager.getApplication() + if (application.isDispatchThread) { + action.run() + } else { + application.invokeLater(action) + } + } + companion object { val TOPIC = Topic.create("autodev.status", AutoDevStatusService::class.java) val currentStatus: Pair get() = ApplicationManager.getApplication().getService(AutoDevStatusService::class.java).getStatus() + @JvmOverloads + fun notifyApplication(status: AutoDevStatus, customMessage: String? = null) { + ApplicationManager.getApplication().messageBus + .syncPublisher(TOPIC) + .onCopilotStatus(status, customMessage) + } + } } \ No newline at end of file diff --git a/src/main/resources/messages/AutoDevBundle.properties b/src/main/resources/messages/AutoDevBundle.properties index 25112ba327..5e3c8412f4 100644 --- a/src/main/resources/messages/AutoDevBundle.properties +++ b/src/main/resources/messages/AutoDevBundle.properties @@ -99,4 +99,5 @@ settings.autodev.coder.generateTest=Generate test autodev.statusbar.name=AutoDev Status Bar autodev.statusbar.toolTipText=AutoDev autodev.statusbar.popup.title=AutoDevStatus +autodev.statusbar.id=AutoDevStatusId