From 9713b856f8abdb003824fd3d0ef4bc8a8bfc5b06 Mon Sep 17 00:00:00 2001 From: nea Date: Sun, 7 Aug 2022 23:51:45 +0200 Subject: progress bar --- .../moe/nea/notenoughupdates/NotEnoughUpdates.kt | 20 +++---- .../notenoughupdates/hud/RepoDownloadProgress.kt | 63 ++++++++++++++++++++++ .../moe/nea/notenoughupdates/repo/ItemCache.kt | 20 +++++-- .../moe/nea/notenoughupdates/repo/RepoManager.kt | 11 ++++ 4 files changed, 100 insertions(+), 14 deletions(-) create mode 100644 src/main/kotlin/moe/nea/notenoughupdates/hud/RepoDownloadProgress.kt 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(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(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( -- cgit