diff --git a/CHANGELOG.md b/CHANGELOG.md index 6867b6f..0bb2520 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,4 +5,5 @@ ### Added - initial support for JetBrains Toolbox 2.6.0.38311 with the possibility to manage the workspaces - i.e. start, stop, - update and delete actions and also quick shortcuts to templates, web terminal and dashboard. \ No newline at end of file + update and delete actions and also quick shortcuts to templates, web terminal and dashboard. +- support for light & dark themes \ No newline at end of file diff --git a/src/main/kotlin/com/coder/toolbox/CoderRemoteEnvironment.kt b/src/main/kotlin/com/coder/toolbox/CoderRemoteEnvironment.kt index 82256be..d9e7d95 100644 --- a/src/main/kotlin/com/coder/toolbox/CoderRemoteEnvironment.kt +++ b/src/main/kotlin/com/coder/toolbox/CoderRemoteEnvironment.kt @@ -45,44 +45,59 @@ class CoderRemoteEnvironment( override val actionsList: MutableStateFlow<List<ActionDescription>> = MutableStateFlow(getAvailableActions()) - private fun getAvailableActions(): List<ActionDescription> = listOf( - Action(context.i18n.ptrl("Open web terminal")) { - context.cs.launch { - BrowserUtil.browse(client.url.withPath("/${workspace.ownerName}/$name/terminal").toString()) { - context.ui.showErrorInfoPopup(it) + private fun getAvailableActions(): List<ActionDescription> { + val actions = mutableListOf( + Action(context.i18n.ptrl("Open web terminal")) { + context.cs.launch { + BrowserUtil.browse(client.url.withPath("/${workspace.ownerName}/$name/terminal").toString()) { + context.ui.showErrorInfoPopup(it) + } } - } - }, - Action(context.i18n.ptrl("Open in dashboard")) { - context.cs.launch { - BrowserUtil.browse(client.url.withPath("/@${workspace.ownerName}/${workspace.name}").toString()) { - context.ui.showErrorInfoPopup(it) + }, + Action(context.i18n.ptrl("Open in dashboard")) { + context.cs.launch { + BrowserUtil.browse(client.url.withPath("/@${workspace.ownerName}/${workspace.name}").toString()) { + context.ui.showErrorInfoPopup(it) + } } - } - }, + }, - Action(context.i18n.ptrl("View template")) { - context.cs.launch { - BrowserUtil.browse(client.url.withPath("/templates/${workspace.templateName}").toString()) { - context.ui.showErrorInfoPopup(it) + Action(context.i18n.ptrl("View template")) { + context.cs.launch { + BrowserUtil.browse(client.url.withPath("/templates/${workspace.templateName}").toString()) { + context.ui.showErrorInfoPopup(it) + } } + }) + + if (wsRawStatus.canStart()) { + if (workspace.outdated) { + actions.add(Action(context.i18n.ptrl("Update and start")) { + val build = client.updateWorkspace(workspace) + update(workspace.copy(latestBuild = build), agent) + }) + } else { + actions.add(Action(context.i18n.ptrl("Start")) { + val build = client.startWorkspace(workspace) + update(workspace.copy(latestBuild = build), agent) + }) } - }, - Action(context.i18n.ptrl("Start"), enabled = { wsRawStatus.canStart() }) { - val build = client.startWorkspace(workspace) - workspace = workspace.copy(latestBuild = build) - update(workspace, agent) - }, - Action(context.i18n.ptrl("Stop"), enabled = { wsRawStatus.canStop() }) { - val build = client.stopWorkspace(workspace) - workspace = workspace.copy(latestBuild = build) - update(workspace, agent) - }, - Action(context.i18n.ptrl("Update"), enabled = { workspace.outdated }) { - val build = client.updateWorkspace(workspace) - workspace = workspace.copy(latestBuild = build) - update(workspace, agent) - }) + } + if (wsRawStatus.canStop()) { + if (workspace.outdated) { + actions.add(Action(context.i18n.ptrl("Update and restart")) { + val build = client.updateWorkspace(workspace) + update(workspace.copy(latestBuild = build), agent) + }) + } else { + actions.add(Action(context.i18n.ptrl("Stop")) { + val build = client.stopWorkspace(workspace) + update(workspace.copy(latestBuild = build), agent) + }) + } + } + return actions + } /** * Update the workspace/agent status to the listeners, if it has changed. diff --git a/src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt b/src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt index a449c39..a30d3fb 100644 --- a/src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt +++ b/src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt @@ -17,6 +17,7 @@ import com.coder.toolbox.views.NewEnvironmentPage import com.coder.toolbox.views.SignInPage import com.coder.toolbox.views.TokenPage import com.jetbrains.toolbox.api.core.ui.icons.SvgIcon +import com.jetbrains.toolbox.api.core.ui.icons.SvgIcon.IconType import com.jetbrains.toolbox.api.core.util.LoadableState import com.jetbrains.toolbox.api.remoteDev.ProviderVisibilityState import com.jetbrains.toolbox.api.remoteDev.RemoteProvider @@ -181,10 +182,16 @@ class CoderRemoteProvider( } override val svgIcon: SvgIcon = - SvgIcon(this::class.java.getResourceAsStream("/icon.svg")?.readAllBytes() ?: byteArrayOf()) + SvgIcon( + this::class.java.getResourceAsStream("/icon.svg")?.readAllBytes() ?: byteArrayOf(), + type = IconType.Masked + ) override val noEnvironmentsSvgIcon: SvgIcon? = - SvgIcon(this::class.java.getResourceAsStream("/icon.svg")?.readAllBytes() ?: byteArrayOf()) + SvgIcon( + this::class.java.getResourceAsStream("/icon.svg")?.readAllBytes() ?: byteArrayOf(), + type = IconType.Masked + ) /** * TODO@JB: It would be nice to show "loading workspaces" at first but it diff --git a/src/main/kotlin/com/coder/toolbox/views/CoderPage.kt b/src/main/kotlin/com/coder/toolbox/views/CoderPage.kt index 6a1c4e3..53b55ea 100644 --- a/src/main/kotlin/com/coder/toolbox/views/CoderPage.kt +++ b/src/main/kotlin/com/coder/toolbox/views/CoderPage.kt @@ -2,6 +2,7 @@ package com.coder.toolbox.views import com.coder.toolbox.CoderToolboxContext import com.jetbrains.toolbox.api.core.ui.icons.SvgIcon +import com.jetbrains.toolbox.api.core.ui.icons.SvgIcon.IconType import com.jetbrains.toolbox.api.localization.LocalizableString import com.jetbrains.toolbox.api.ui.actions.RunnableActionDescription import com.jetbrains.toolbox.api.ui.components.UiField @@ -46,9 +47,12 @@ abstract class CoderPage( * This seems to only work on the first page. */ override val svgIcon: SvgIcon? = if (showIcon) { - SvgIcon(this::class.java.getResourceAsStream("/icon.svg")?.readAllBytes() ?: byteArrayOf()) + SvgIcon( + this::class.java.getResourceAsStream("/icon.svg")?.readAllBytes() ?: byteArrayOf(), + type = IconType.Masked + ) } else { - SvgIcon(byteArrayOf()) + SvgIcon(byteArrayOf(), type = IconType.Masked) } /** diff --git a/src/main/resources/localization/defaultMessages.po b/src/main/resources/localization/defaultMessages.po index 837e2a0..aa96e05 100644 --- a/src/main/resources/localization/defaultMessages.po +++ b/src/main/resources/localization/defaultMessages.po @@ -73,7 +73,10 @@ msgstr "" msgid "Stop" msgstr "" -msgid "Update" +msgid "Update and start" +msgstr "" + +msgid "Update and restart" msgstr "" msgid "Settings"