progress bar

This commit is contained in:
nea
2022-08-07 23:51:45 +02:00
parent dc4755eb79
commit 9713b856f8
4 changed files with 100 additions and 14 deletions

View File

@@ -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 {

View File

@@ -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,
)
}
}

View File

@@ -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)
}
}
}

View File

@@ -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(