diff --git a/CHANGELOG.md b/CHANGELOG.md
index eac4f6c1..adf978a2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@
### Added
- warning system when plugin might not be compatible with Coder REST API
- a `Create workspace` button which links to Coder's templates page
+- workspace icons
### Changed
- redesigned the information&warning banner. Messages can now include hyperlinks
@@ -14,6 +15,7 @@
### Fixed
- outdated Coder CLI binaries are cleaned up
- workspace status color style: running workspaces are green, failed ones should be red, everything else is gray
+- typos in plugin description
## 2.1.2 - 2022-11-23
diff --git a/README.md b/README.md
index 0b56aab2..c7392e04 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ Follow](https://img.shields.io/twitter/follow/CoderHQ?label=%40CoderHQ&style=soc
[](https://github.com/coder/coder-jetbrains/actions/workflows/build.yml)
-**Coder Gateway** connects your Jetbrains IDE to your [Coder Workspaces](https://coder.com/docs/coder-oss/latest/workspaces) so that you can develop from anywhere.
+**Coder Gateway** connects your JetBrains IDE to your [Coder Workspaces](https://coder.com/docs/coder-oss/latest/workspaces) so that you can develop from anywhere.
**Manage less**
diff --git a/src/main/kotlin/com/coder/gateway/icons/CoderIcons.kt b/src/main/kotlin/com/coder/gateway/icons/CoderIcons.kt
index 16322770..dbf2b4d8 100644
--- a/src/main/kotlin/com/coder/gateway/icons/CoderIcons.kt
+++ b/src/main/kotlin/com/coder/gateway/icons/CoderIcons.kt
@@ -5,7 +5,6 @@ import com.intellij.openapi.util.IconLoader
object CoderIcons {
val LOGO = IconLoader.getIcon("coder_logo.svg", javaClass)
val LOGO_16 = IconLoader.getIcon("coder_logo_16.svg", javaClass)
- val LOGO_52 = IconLoader.getIcon("coder_logo_52.svg", javaClass)
val OPEN_TERMINAL = IconLoader.getIcon("open_terminal.svg", javaClass)
@@ -13,15 +12,46 @@ object CoderIcons {
val RUN = IconLoader.getIcon("run.svg", javaClass)
val STOP = IconLoader.getIcon("stop.svg", javaClass)
val UPDATE = IconLoader.getIcon("update.svg", javaClass)
+ val DELETE = IconLoader.getIcon("delete.svg", javaClass)
- val WINDOWS = IconLoader.getIcon("windows.svg", javaClass)
- val MACOS = IconLoader.getIcon("macOS.svg", javaClass)
- val LINUX = IconLoader.getIcon("linux.svg", javaClass)
val UNKNOWN = IconLoader.getIcon("unknown.svg", javaClass)
- val GREEN_CIRCLE = IconLoader.getIcon("green_circle.svg", javaClass)
- val GRAY_CIRCLE = IconLoader.getIcon("gray_circle.svg", javaClass)
- val RED_CIRCLE = IconLoader.getIcon("red_circle.svg", javaClass)
+ val ZERO = IconLoader.getIcon("0.svg", javaClass)
+ val ONE = IconLoader.getIcon("1.svg", javaClass)
+ val TWO = IconLoader.getIcon("2.svg", javaClass)
+ val THREE = IconLoader.getIcon("3.svg", javaClass)
+ val FOUR = IconLoader.getIcon("4.svg", javaClass)
+ val FIVE = IconLoader.getIcon("5.svg", javaClass)
+ val SIX = IconLoader.getIcon("6.svg", javaClass)
+ val SEVEN = IconLoader.getIcon("7.svg", javaClass)
+ val EIGHT = IconLoader.getIcon("8.svg", javaClass)
+ val NINE = IconLoader.getIcon("9.svg", javaClass)
+
+ val A = IconLoader.getIcon("a.svg", javaClass)
+ val B = IconLoader.getIcon("b.svg", javaClass)
+ val C = IconLoader.getIcon("c.svg", javaClass)
+ val D = IconLoader.getIcon("d.svg", javaClass)
+ val E = IconLoader.getIcon("e.svg", javaClass)
+ val F = IconLoader.getIcon("f.svg", javaClass)
+ val G = IconLoader.getIcon("g.svg", javaClass)
+ val H = IconLoader.getIcon("h.svg", javaClass)
+ val I = IconLoader.getIcon("i.svg", javaClass)
+ val J = IconLoader.getIcon("j.svg", javaClass)
+ val K = IconLoader.getIcon("k.svg", javaClass)
+ val L = IconLoader.getIcon("l.svg", javaClass)
+ val M = IconLoader.getIcon("m.svg", javaClass)
+ val N = IconLoader.getIcon("n.svg", javaClass)
+ val O = IconLoader.getIcon("o.svg", javaClass)
+ val P = IconLoader.getIcon("p.svg", javaClass)
+ val Q = IconLoader.getIcon("q.svg", javaClass)
+ val R = IconLoader.getIcon("r.svg", javaClass)
+ val S = IconLoader.getIcon("s.svg", javaClass)
+ val T = IconLoader.getIcon("t.svg", javaClass)
+ val U = IconLoader.getIcon("u.svg", javaClass)
+ val V = IconLoader.getIcon("v.svg", javaClass)
+ val W = IconLoader.getIcon("w.svg", javaClass)
+ val X = IconLoader.getIcon("x.svg", javaClass)
+ val Y = IconLoader.getIcon("y.svg", javaClass)
+ val Z = IconLoader.getIcon("z.svg", javaClass)
- val DELETE = IconLoader.getIcon("delete.svg", javaClass)
}
\ No newline at end of file
diff --git a/src/main/kotlin/com/coder/gateway/models/WorkspaceAgentModel.kt b/src/main/kotlin/com/coder/gateway/models/WorkspaceAgentModel.kt
index 049501c0..91367a6c 100644
--- a/src/main/kotlin/com/coder/gateway/models/WorkspaceAgentModel.kt
+++ b/src/main/kotlin/com/coder/gateway/models/WorkspaceAgentModel.kt
@@ -4,6 +4,7 @@ import com.coder.gateway.sdk.Arch
import com.coder.gateway.sdk.OS
import com.coder.gateway.sdk.v2.models.WorkspaceTransition
import java.util.UUID
+import javax.swing.Icon
data class WorkspaceAgentModel(
val workspaceID: UUID,
@@ -11,6 +12,7 @@ data class WorkspaceAgentModel(
val name: String,
val templateID: UUID,
val templateName: String,
+ val templateIcon: Icon,
val status: WorkspaceVersionStatus,
val agentStatus: WorkspaceAgentStatus,
val lastBuildTransition: WorkspaceTransition,
diff --git a/src/main/kotlin/com/coder/gateway/sdk/CoderRestClientService.kt b/src/main/kotlin/com/coder/gateway/sdk/CoderRestClientService.kt
index 2cc56438..c8b2102d 100644
--- a/src/main/kotlin/com/coder/gateway/sdk/CoderRestClientService.kt
+++ b/src/main/kotlin/com/coder/gateway/sdk/CoderRestClientService.kt
@@ -28,6 +28,7 @@ import java.util.UUID
@Service(Service.Level.APP)
class CoderRestClientService {
+ private lateinit var httpClient: OkHttpClient
private lateinit var retroRestClient: CoderV2RestFacade
private lateinit var sessionToken: String
lateinit var coderURL: URL
@@ -43,15 +44,14 @@ class CoderRestClientService {
.registerTypeAdapter(Instant::class.java, InstantConverter())
.setPrettyPrinting()
.create()
+ httpClient = OkHttpClient.Builder()
+ .addInterceptor { it.proceed(it.request().newBuilder().addHeader("Coder-Session-Token", token).build()) }
+ .addInterceptor(HttpLoggingInterceptor().apply { setLevel(HttpLoggingInterceptor.Level.BASIC) })
+ .build()
retroRestClient = Retrofit.Builder()
.baseUrl(url.toString())
- .client(
- OkHttpClient.Builder()
- .addInterceptor { it.proceed(it.request().newBuilder().addHeader("Coder-Session-Token", token).build()) }
- .addInterceptor(HttpLoggingInterceptor().apply { setLevel(HttpLoggingInterceptor.Level.BASIC) })
- .build()
- )
+ .client(httpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
.create(CoderV2RestFacade::class.java)
diff --git a/src/main/kotlin/com/coder/gateway/sdk/TemplateIconDownloader.kt b/src/main/kotlin/com/coder/gateway/sdk/TemplateIconDownloader.kt
new file mode 100644
index 00000000..89e6a3b9
--- /dev/null
+++ b/src/main/kotlin/com/coder/gateway/sdk/TemplateIconDownloader.kt
@@ -0,0 +1,80 @@
+package com.coder.gateway.sdk
+
+import com.coder.gateway.icons.CoderIcons
+import com.intellij.openapi.components.Service
+import com.intellij.openapi.components.service
+import com.intellij.ui.scale.ScaleContext
+import com.intellij.util.ImageLoader
+import com.intellij.util.ui.ImageUtil
+import java.net.URL
+import javax.swing.Icon
+import javax.swing.ImageIcon
+
+@Service(Service.Level.APP)
+class TemplateIconDownloader {
+ private val coderClient: CoderRestClientService = service()
+
+ fun load(path: String, templateName: String): Icon {
+ var url: URL? = null
+ if (path.startsWith("http")) {
+ url = path.toURL()
+ } else if (path.contains(coderClient.coderURL.host)) {
+ url = coderClient.coderURL.withPath(path)
+ }
+
+ if (url != null) {
+ var img = ImageLoader.loadFromUrl(url)
+ if (img != null) {
+ if (ImageUtil.getRealHeight(img) > 32 && ImageUtil.getRealWidth(img) > 32) {
+ img = ImageUtil.resize(img, 32, ScaleContext.create())
+ }
+ return ImageIcon(img)
+ }
+ }
+
+ return iconForChar(templateName.lowercase().first())
+ }
+
+ private fun iconForChar(c: Char) = when (c) {
+ '0' -> CoderIcons.ZERO
+ '1' -> CoderIcons.ONE
+ '2' -> CoderIcons.TWO
+ '3' -> CoderIcons.THREE
+ '4' -> CoderIcons.FOUR
+ '5' -> CoderIcons.FIVE
+ '6' -> CoderIcons.SIX
+ '7' -> CoderIcons.SEVEN
+ '8' -> CoderIcons.EIGHT
+ '9' -> CoderIcons.NINE
+
+ 'a' -> CoderIcons.A
+ 'b' -> CoderIcons.B
+ 'c' -> CoderIcons.C
+ 'd' -> CoderIcons.D
+ 'e' -> CoderIcons.E
+ 'f' -> CoderIcons.F
+ 'g' -> CoderIcons.G
+ 'h' -> CoderIcons.H
+ 'i' -> CoderIcons.I
+ 'j' -> CoderIcons.J
+ 'k' -> CoderIcons.K
+ 'l' -> CoderIcons.L
+ 'm' -> CoderIcons.M
+ 'n' -> CoderIcons.N
+ 'o' -> CoderIcons.O
+ 'p' -> CoderIcons.P
+ 'q' -> CoderIcons.Q
+ 'r' -> CoderIcons.R
+ 's' -> CoderIcons.S
+ 't' -> CoderIcons.T
+ 'u' -> CoderIcons.U
+ 'v' -> CoderIcons.V
+ 'w' -> CoderIcons.W
+ 'x' -> CoderIcons.X
+ 'y' -> CoderIcons.Y
+ 'z' -> CoderIcons.Z
+
+ else -> CoderIcons.UNKNOWN
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/coder/gateway/views/steps/CoderWorkspacesStepView.kt b/src/main/kotlin/com/coder/gateway/views/steps/CoderWorkspacesStepView.kt
index 9b19a9b3..fdb7dc8e 100644
--- a/src/main/kotlin/com/coder/gateway/views/steps/CoderWorkspacesStepView.kt
+++ b/src/main/kotlin/com/coder/gateway/views/steps/CoderWorkspacesStepView.kt
@@ -15,6 +15,7 @@ import com.coder.gateway.sdk.CoderCLIManager
import com.coder.gateway.sdk.CoderRestClientService
import com.coder.gateway.sdk.CoderSemVer
import com.coder.gateway.sdk.OS
+import com.coder.gateway.sdk.TemplateIconDownloader
import com.coder.gateway.sdk.ex.AuthenticationResponseException
import com.coder.gateway.sdk.ex.TemplateResponseException
import com.coder.gateway.sdk.ex.WorkspaceResponseException
@@ -83,6 +84,8 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
private val cs = CoroutineScope(Dispatchers.Main)
private var localWizardModel = CoderWorkspacesWizardModel()
private val coderClient: CoderRestClientService = service()
+ private val iconDownloader: TemplateIconDownloader = service()
+
private val appPropertiesService: PropertiesComponent = service()
private var tfUrl: JTextField? = null
@@ -448,6 +451,7 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
this.name,
this.templateID,
this.templateName,
+ iconDownloader.load(this@agentModels.templateIcon, this.name),
WorkspaceVersionStatus.from(this),
WorkspaceAgentStatus.from(this),
this.latestBuild.transition,
@@ -466,6 +470,7 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
workspaceWithAgentName,
this.templateID,
this.templateName,
+ iconDownloader.load(this@agentModels.templateIcon, workspaceWithAgentName),
WorkspaceVersionStatus.from(this),
WorkspaceAgentStatus.from(this),
this.latestBuild.transition,
@@ -484,6 +489,7 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
this.name,
this.templateID,
this.templateName,
+ iconDownloader.load(this@agentModels.templateIcon, this.name),
WorkspaceVersionStatus.from(this),
WorkspaceAgentStatus.from(this),
this.latestBuild.transition,
@@ -550,15 +556,16 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
}
override fun getIcon(value: String, table: JTable?, row: Int): Icon {
- return when (OS.from(value)) {
- OS.LINUX -> CoderIcons.LINUX
- OS.WINDOWS -> CoderIcons.WINDOWS
- OS.MAC -> CoderIcons.MACOS
- else -> CoderIcons.UNKNOWN
- }
+ return item?.templateIcon ?: CoderIcons.UNKNOWN
}
override fun isCenterAlignment() = true
+
+ override fun getTableCellRendererComponent(table: JTable?, value: Any?, selected: Boolean, focus: Boolean, row: Int, column: Int): Component {
+ return super.getTableCellRendererComponent(table, value, selected, focus, row, column).apply {
+ border = JBUI.Borders.empty(10, 10)
+ }
+ }
}
}
}
diff --git a/src/main/resources/0.svg b/src/main/resources/0.svg
new file mode 100644
index 00000000..b029dbe8
--- /dev/null
+++ b/src/main/resources/0.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/1.svg b/src/main/resources/1.svg
new file mode 100644
index 00000000..c4dd6526
--- /dev/null
+++ b/src/main/resources/1.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/2.svg b/src/main/resources/2.svg
new file mode 100644
index 00000000..7bbc4ca9
--- /dev/null
+++ b/src/main/resources/2.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/3.svg b/src/main/resources/3.svg
new file mode 100644
index 00000000..550fb776
--- /dev/null
+++ b/src/main/resources/3.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/4.svg b/src/main/resources/4.svg
new file mode 100644
index 00000000..148ee7c2
--- /dev/null
+++ b/src/main/resources/4.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/5.svg b/src/main/resources/5.svg
new file mode 100644
index 00000000..6a40682e
--- /dev/null
+++ b/src/main/resources/5.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/6.svg b/src/main/resources/6.svg
new file mode 100644
index 00000000..6cf682f6
--- /dev/null
+++ b/src/main/resources/6.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/7.svg b/src/main/resources/7.svg
new file mode 100644
index 00000000..b1ed89e3
--- /dev/null
+++ b/src/main/resources/7.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/8.svg b/src/main/resources/8.svg
new file mode 100644
index 00000000..26726836
--- /dev/null
+++ b/src/main/resources/8.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/9.svg b/src/main/resources/9.svg
new file mode 100644
index 00000000..986e77ed
--- /dev/null
+++ b/src/main/resources/9.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index b7a7aade..a020df3b 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -13,6 +13,7 @@
+
diff --git a/src/main/resources/a.svg b/src/main/resources/a.svg
new file mode 100644
index 00000000..849916d9
--- /dev/null
+++ b/src/main/resources/a.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/b.svg b/src/main/resources/b.svg
new file mode 100644
index 00000000..ee63cd69
--- /dev/null
+++ b/src/main/resources/b.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/c.svg b/src/main/resources/c.svg
new file mode 100644
index 00000000..75965495
--- /dev/null
+++ b/src/main/resources/c.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/coder_logo_52.svg b/src/main/resources/coder_logo_52.svg
deleted file mode 100644
index 82550043..00000000
--- a/src/main/resources/coder_logo_52.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
diff --git a/src/main/resources/coder_logo_52_dark.svg b/src/main/resources/coder_logo_52_dark.svg
deleted file mode 100644
index 64d036ad..00000000
--- a/src/main/resources/coder_logo_52_dark.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
diff --git a/src/main/resources/d.svg b/src/main/resources/d.svg
new file mode 100644
index 00000000..f7ec9256
--- /dev/null
+++ b/src/main/resources/d.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/e.svg b/src/main/resources/e.svg
new file mode 100644
index 00000000..745679fe
--- /dev/null
+++ b/src/main/resources/e.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/f.svg b/src/main/resources/f.svg
new file mode 100644
index 00000000..bc3dfdd7
--- /dev/null
+++ b/src/main/resources/f.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/g.svg b/src/main/resources/g.svg
new file mode 100644
index 00000000..8748b224
--- /dev/null
+++ b/src/main/resources/g.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/gray_circle.svg b/src/main/resources/gray_circle.svg
deleted file mode 100644
index 4773ff5f..00000000
--- a/src/main/resources/gray_circle.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/green_circle.svg b/src/main/resources/green_circle.svg
deleted file mode 100644
index e57699ac..00000000
--- a/src/main/resources/green_circle.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/main/resources/h.svg b/src/main/resources/h.svg
new file mode 100644
index 00000000..171b5d3c
--- /dev/null
+++ b/src/main/resources/h.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/i.svg b/src/main/resources/i.svg
new file mode 100644
index 00000000..558d299b
--- /dev/null
+++ b/src/main/resources/i.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/j.svg b/src/main/resources/j.svg
new file mode 100644
index 00000000..16cf7645
--- /dev/null
+++ b/src/main/resources/j.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/k.svg b/src/main/resources/k.svg
new file mode 100644
index 00000000..5edd63f6
--- /dev/null
+++ b/src/main/resources/k.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/l.svg b/src/main/resources/l.svg
new file mode 100644
index 00000000..700bc56a
--- /dev/null
+++ b/src/main/resources/l.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/linux.svg b/src/main/resources/linux.svg
deleted file mode 100644
index bb4ba0c2..00000000
--- a/src/main/resources/linux.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/src/main/resources/m.svg b/src/main/resources/m.svg
new file mode 100644
index 00000000..b61931c2
--- /dev/null
+++ b/src/main/resources/m.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/macOS.svg b/src/main/resources/macOS.svg
deleted file mode 100644
index b61e0cfa..00000000
--- a/src/main/resources/macOS.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
diff --git a/src/main/resources/messages/CoderGatewayBundle.properties b/src/main/resources/messages/CoderGatewayBundle.properties
index 13ad7cda..8611e344 100644
--- a/src/main/resources/messages/CoderGatewayBundle.properties
+++ b/src/main/resources/messages/CoderGatewayBundle.properties
@@ -6,7 +6,7 @@ gateway.connector.view.login.url.label=URL:
gateway.connector.view.login.token.dialog=Paste your token here:
gateway.connector.view.login.token.label=Session Token:
gateway.connector.view.coder.workspaces.header.text=Coder Workspaces
-gateway.connector.view.coder.workspaces.comment=Self-hosted developer workspaces in the cloud or on premise. Coder empower developers with secure, consistent, and fast developer workspaces.
+gateway.connector.view.coder.workspaces.comment=Self-hosted developer workspaces in the cloud or on-premises. Coder empowers developers with secure, consistent, and fast developer workspaces.
gateway.connector.view.coder.workspaces.connect.text=Connect
gateway.connector.view.coder.workspaces.cli.downloader.dialog.title=Authenticate and setup Coder
gateway.connector.view.coder.workspaces.cli.configssh.dialog.title=Coder Config SSH
diff --git a/src/main/resources/n.svg b/src/main/resources/n.svg
new file mode 100644
index 00000000..fb104f66
--- /dev/null
+++ b/src/main/resources/n.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/o.svg b/src/main/resources/o.svg
new file mode 100644
index 00000000..a7d79677
--- /dev/null
+++ b/src/main/resources/o.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/p.svg b/src/main/resources/p.svg
new file mode 100644
index 00000000..9c659bc2
--- /dev/null
+++ b/src/main/resources/p.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/q.svg b/src/main/resources/q.svg
new file mode 100644
index 00000000..71269a1f
--- /dev/null
+++ b/src/main/resources/q.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/r.svg b/src/main/resources/r.svg
new file mode 100644
index 00000000..c01b88bf
--- /dev/null
+++ b/src/main/resources/r.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/red_circle.svg b/src/main/resources/red_circle.svg
deleted file mode 100644
index 001b82d1..00000000
--- a/src/main/resources/red_circle.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/s.svg b/src/main/resources/s.svg
new file mode 100644
index 00000000..81c42951
--- /dev/null
+++ b/src/main/resources/s.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/t.svg b/src/main/resources/t.svg
new file mode 100644
index 00000000..f50bfd78
--- /dev/null
+++ b/src/main/resources/t.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/u.svg b/src/main/resources/u.svg
new file mode 100644
index 00000000..743acab9
--- /dev/null
+++ b/src/main/resources/u.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/v.svg b/src/main/resources/v.svg
new file mode 100644
index 00000000..bfe4c922
--- /dev/null
+++ b/src/main/resources/v.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/w.svg b/src/main/resources/w.svg
new file mode 100644
index 00000000..4ada3db1
--- /dev/null
+++ b/src/main/resources/w.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/windows.svg b/src/main/resources/windows.svg
deleted file mode 100644
index 34bcd78b..00000000
--- a/src/main/resources/windows.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
diff --git a/src/main/resources/x.svg b/src/main/resources/x.svg
new file mode 100644
index 00000000..83a30626
--- /dev/null
+++ b/src/main/resources/x.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/y.svg b/src/main/resources/y.svg
new file mode 100644
index 00000000..01335cbc
--- /dev/null
+++ b/src/main/resources/y.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/main/resources/z.svg b/src/main/resources/z.svg
new file mode 100644
index 00000000..3511cf77
--- /dev/null
+++ b/src/main/resources/z.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file