aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/notenoughupdates
diff options
context:
space:
mode:
authornea <romangraef@gmail.com>2022-08-07 23:51:45 +0200
committernea <romangraef@gmail.com>2022-08-07 23:51:45 +0200
commit9713b856f8abdb003824fd3d0ef4bc8a8bfc5b06 (patch)
tree72f24e1f42e8449c8fb993aca33d752008a13f7b /src/main/kotlin/moe/nea/notenoughupdates
parentdc4755eb79ab78f87b0e1e4ad6dac81912af0ee0 (diff)
downloadFirmament-9713b856f8abdb003824fd3d0ef4bc8a8bfc5b06.tar.gz
Firmament-9713b856f8abdb003824fd3d0ef4bc8a8bfc5b06.tar.bz2
Firmament-9713b856f8abdb003824fd3d0ef4bc8a8bfc5b06.zip
progress bar
Diffstat (limited to 'src/main/kotlin/moe/nea/notenoughupdates')
-rw-r--r--src/main/kotlin/moe/nea/notenoughupdates/NotEnoughUpdates.kt20
-rw-r--r--src/main/kotlin/moe/nea/notenoughupdates/hud/RepoDownloadProgress.kt63
-rw-r--r--src/main/kotlin/moe/nea/notenoughupdates/repo/ItemCache.kt20
-rw-r--r--src/main/kotlin/moe/nea/notenoughupdates/repo/RepoManager.kt11
4 files changed, 100 insertions, 14 deletions
diff --git a/src/main/kotlin/moe/nea/notenoughupdates/NotEnoughUpdates.kt b/src/main/kotlin/moe/nea/notenoughupdates/NotEnoughUpdates.kt
index 86baa8a..bede38a 100644
--- a/src/main/kotlin/moe/nea/notenoughupdates/NotEnoughUpdates.kt
+++ b/src/main/kotlin/moe/nea/notenoughupdates/NotEnoughUpdates.kt
@@ -3,7 +3,6 @@ package moe.nea.notenoughupdates
import com.mojang.brigadier.Command
import com.mojang.brigadier.CommandDispatcher
import io.github.cottonmc.cotton.gui.client.CottonClientScreen
-import io.github.moulberry.repo.NEURepositoryException
import io.ktor.client.*
import io.ktor.client.plugins.*
import io.ktor.client.plugins.contentnegotiation.*
@@ -67,16 +66,17 @@ object NotEnoughUpdates : ModInitializer, ClientModInitializer {
@Suppress("UNUSED_PARAMETER")
_ctx: CommandBuildContext
) {
- dispatcher.register(ClientCommandManager.literal("neureload").executes {
- it.source.sendFeedback(Component.literal("Reloading repository from disk. This may lag a bit."))
- try {
+ dispatcher.register(ClientCommandManager.literal("neureload")
+ .then(ClientCommandManager.literal("fetch").executes {
+ it.source.sendFeedback(Component.literal("Trying to redownload the repository")) // TODO better reporting
+ RepoManager.launchAsyncUpdate()
+ Command.SINGLE_SUCCESS
+ })
+ .executes {
+ it.source.sendFeedback(Component.literal("Reloading repository from disk. This may lag a bit."))
RepoManager.reload()
- } catch (exc: NEURepositoryException) {
- it.source.sendError(Component.literal("There has been an error reloading the repository. Please try again. IF this persists, delete the .notenoughupdates folder in your mincraft folder"))
- exc.printStackTrace()
- }
- Command.SINGLE_SUCCESS
- })
+ Command.SINGLE_SUCCESS
+ })
dispatcher.register(
ClientCommandManager.literal("neu")
.then(ClientCommandManager.literal("repo").executes {
diff --git a/src/main/kotlin/moe/nea/notenoughupdates/hud/RepoDownloadProgress.kt b/src/main/kotlin/moe/nea/notenoughupdates/hud/RepoDownloadProgress.kt
new file mode 100644
index 0000000..462f0bc
--- /dev/null
+++ b/src/main/kotlin/moe/nea/notenoughupdates/hud/RepoDownloadProgress.kt
@@ -0,0 +1,63 @@
+package moe.nea.notenoughupdates.hud
+
+import com.mojang.blaze3d.vertex.PoseStack
+import io.github.cottonmc.cotton.gui.client.ScreenDrawing
+import io.github.cottonmc.cotton.gui.widget.WWidget
+import io.github.cottonmc.cotton.gui.widget.data.HorizontalAlignment
+import io.github.cottonmc.cotton.gui.widget.data.Insets
+import kotlin.math.roundToInt
+import kotlin.math.sin
+
+
+val Insets.vertical get() = bottom + top
+val Insets.horizontal get() = left + right
+
+class ProgressBar(
+ var label: String,
+ var total: Int?, // If total is null, then make it a bouncy rectangle
+ var progress: Int = 0,
+) : WWidget() {
+
+ var insets: Insets = Insets(7)
+ override fun canResize(): Boolean = true
+
+
+ fun reportProgress(label: String, progress: Int, total: Int?) {
+ synchronized(this) {
+ this.label = label
+ this.progress = progress
+ this.total = total
+ }
+
+ }
+
+ override fun paint(matrices: PoseStack, x: Int, y: Int, mouseX: Int, mouseY: Int) {
+ ScreenDrawing.coloredRect(matrices, x, y, width, height, 0xFF808080.toInt())
+ val (l, prog) = synchronized(this) {
+ label to (progress to total)
+ }
+ val (p, t) = prog
+
+ if (t == null) {
+ ScreenDrawing.coloredRect(
+ matrices,
+ (x + (1 + sin(System.currentTimeMillis().toDouble() / 1000)) * width * 3 / 4 / 2).roundToInt(),
+ y,
+ width / 4,
+ height,
+ 0xFF00FF00.toInt()
+ )
+ } else {
+ ScreenDrawing.coloredRect(matrices, x, y, width * p / t, height, 0xFF00FF00.toInt())
+ }
+ ScreenDrawing.drawString(
+ matrices,
+ if (t != null) "$l ($p/$t)" else l,
+ HorizontalAlignment.CENTER,
+ x + insets.left,
+ y + insets.top,
+ width - insets.horizontal,
+ height - insets.vertical,
+ )
+ }
+}
diff --git a/src/main/kotlin/moe/nea/notenoughupdates/repo/ItemCache.kt b/src/main/kotlin/moe/nea/notenoughupdates/repo/ItemCache.kt
index 8deb4c3..9255867 100644
--- a/src/main/kotlin/moe/nea/notenoughupdates/repo/ItemCache.kt
+++ b/src/main/kotlin/moe/nea/notenoughupdates/repo/ItemCache.kt
@@ -1,6 +1,7 @@
package moe.nea.notenoughupdates.repo
import com.mojang.serialization.Dynamic
+import io.github.cottonmc.cotton.gui.client.CottonHud
import io.github.moulberry.repo.IReloadable
import io.github.moulberry.repo.NEURepository
import io.github.moulberry.repo.data.NEUItem
@@ -79,11 +80,22 @@ object ItemCache : IReloadable {
val j = job
if (j != null && j.isActive) {
j.cancel()
- job = NotEnoughUpdates.coroutineScope.launch {
- repository.items?.items?.values?.forEach {
- it.asItemStack() // Rebuild cache
- }
+ }
+
+ job = NotEnoughUpdates.coroutineScope.launch {
+ val items = repository.items?.items
+ if (items == null) {
+ CottonHud.remove(RepoManager.progressBar)
+ return@launch
+ }
+ RepoManager.progressBar.reportProgress("Recache Items", 0, items.size)
+ CottonHud.add(RepoManager.progressBar)
+ var i = 0
+ items.values.forEach {
+ it.asItemStack() // Rebuild cache
+ RepoManager.progressBar.reportProgress("Recache Items", i++, items.size)
}
+ CottonHud.remove(RepoManager.progressBar)
}
}
}
diff --git a/src/main/kotlin/moe/nea/notenoughupdates/repo/RepoManager.kt b/src/main/kotlin/moe/nea/notenoughupdates/repo/RepoManager.kt
index 375b2bb..c515ff7 100644
--- a/src/main/kotlin/moe/nea/notenoughupdates/repo/RepoManager.kt
+++ b/src/main/kotlin/moe/nea/notenoughupdates/repo/RepoManager.kt
@@ -1,5 +1,6 @@
package moe.nea.notenoughupdates.repo
+import io.github.cottonmc.cotton.gui.client.CottonHud
import io.github.moulberry.repo.NEURepository
import io.github.moulberry.repo.NEURepositoryException
import kotlinx.coroutines.launch
@@ -7,6 +8,7 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.serializer
import moe.nea.notenoughupdates.NotEnoughUpdates
import moe.nea.notenoughupdates.NotEnoughUpdates.logger
+import moe.nea.notenoughupdates.hud.ProgressBar
import moe.nea.notenoughupdates.util.ConfigHolder
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents
import net.minecraft.client.Minecraft
@@ -24,6 +26,10 @@ object RepoManager : ConfigHolder<RepoManager.Config>(serializer(), "repo", ::Co
var recentlyFailedToUpdateItemList = false
+ val progressBar = ProgressBar("", null, 0).also {
+ it.setSize(180, 22)
+ }
+
val neuRepo: NEURepository = NEURepository.of(RepoDownloadManager.repoSavedLocation).apply {
registerReloadListener(ItemCache)
registerReloadListener {
@@ -49,13 +55,18 @@ object RepoManager : ConfigHolder<RepoManager.Config>(serializer(), "repo", ::Co
fun launchAsyncUpdate() {
NotEnoughUpdates.coroutineScope.launch {
+ progressBar.reportProgress("Downloading", 0, null)
+ CottonHud.add(progressBar)
RepoDownloadManager.downloadUpdate()
+ progressBar.reportProgress("Download complete", 1, 1)
reload()
}
}
fun reload() {
try {
+ progressBar.reportProgress("Reloading from Disk", 0, null)
+ CottonHud.add(progressBar)
neuRepo.reload()
} catch (exc: NEURepositoryException) {
Minecraft.getInstance().player?.sendSystemMessage(