Skip to content

Commit

Permalink
feat(statusbar): add AutoDevStatusId to AutoDevStatusBarWidget
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
phodal committed Jan 13, 2024
1 parent 54269bc commit a0993d6
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 4 deletions.
Expand Up @@ -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
Expand All @@ -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"))
}
}
}
}
Expand Up @@ -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
Expand Down Expand Up @@ -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<AutoDevStatus, String?>
get() = ApplicationManager.getApplication().getService(AutoDevStatusService::class.java).getStatus()

@JvmOverloads
fun notifyApplication(status: AutoDevStatus, customMessage: String? = null) {
ApplicationManager.getApplication().messageBus
.syncPublisher(TOPIC)
.onCopilotStatus(status, customMessage)
}

}
}
1 change: 1 addition & 0 deletions src/main/resources/messages/AutoDevBundle.properties
Expand Up @@ -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

0 comments on commit a0993d6

Please sign in to comment.