Skip to content

Commit

Permalink
GUI cleanup and enter to download
Browse files Browse the repository at this point in the history
  • Loading branch information
Avanatiker committed Dec 26, 2023
1 parent 8b22fa4 commit da370fa
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 32 deletions.
27 changes: 27 additions & 0 deletions common/src/main/kotlin/org/waste/of/time/gui/EnterTextField.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.waste.of.time.gui

import net.minecraft.client.MinecraftClient
import net.minecraft.client.font.TextRenderer
import net.minecraft.client.gui.widget.TextFieldWidget
import net.minecraft.text.Text
import org.lwjgl.glfw.GLFW
import org.waste.of.time.manager.CaptureManager

class EnterTextField(
textRenderer: TextRenderer, x: Int, y: Int, width: Int, height: Int, message: Text, val client: MinecraftClient?
) : TextFieldWidget(textRenderer, x, y, width, height, message) {

override fun keyPressed(keyCode: Int, scanCode: Int, modifiers: Int): Boolean {
if (keyCode == GLFW.GLFW_KEY_ENTER) {
if (CaptureManager.capturing) {
client?.setScreen(null)
CaptureManager.stop()
} else {
client?.setScreen(null)
CaptureManager.start(text)
}
return true
}
return super.keyPressed(keyCode, scanCode, modifiers)
}
}
97 changes: 69 additions & 28 deletions common/src/main/kotlin/org/waste/of/time/gui/ManagerScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,54 +4,95 @@ import me.shedaniel.autoconfig.AutoConfig
import net.minecraft.client.gui.screen.Screen
import net.minecraft.client.gui.widget.*
import net.minecraft.text.Text
import org.lwjgl.glfw.GLFW
import org.waste.of.time.WorldTools.MAX_LEVEL_NAME_LENGTH
import org.waste.of.time.config.WorldToolsConfig
import org.waste.of.time.manager.CaptureManager
import org.waste.of.time.manager.CaptureManager.currentLevelName
import org.waste.of.time.manager.CaptureManager.levelName

object ManagerScreen : Screen(Text.translatable("worldtools.gui.manager.title")) {
private lateinit var worldNameTextEntryWidget: TextFieldWidget
private lateinit var titleWidget: TextWidget
private lateinit var downloadButton: ButtonWidget
private lateinit var configButton: ButtonWidget
private lateinit var cancelButton: ButtonWidget
private const val BUTTON_WIDTH = 90

override fun init() {
val title = TextWidget(Text.translatable("worldtools.gui.manager.title"), textRenderer)
SimplePositioningWidget.setPos(title, 0, 0, width, height, 0.5f, 0.01f)
addDrawableChild(title)
setupTitle()
setupEntryGrid()
setupBottomGrid()
}

val entryGridWidget = GridWidget()
entryGridWidget.mainPositioner.margin(4, 4, 4, 0)
override fun tick() {
if (CaptureManager.capturing) {
downloadButton.message = Text.translatable("worldtools.gui.manager.button.stop_download")
worldNameTextEntryWidget.setPlaceholder(Text.of(currentLevelName))
worldNameTextEntryWidget.setEditable(false)
} else {
downloadButton.message = Text.translatable("worldtools.gui.manager.button.start_download")
worldNameTextEntryWidget.setEditable(true)
}
super.tick()
}

private fun setupTitle() {
titleWidget = TextWidget(Text.translatable("worldtools.gui.manager.title"), textRenderer)
SimplePositioningWidget.setPos(titleWidget, 0, 0, width, height, 0.5f, 0.01f)
addDrawableChild(titleWidget)
}

private fun setupEntryGrid() {
val entryGridWidget = createGridWidget()
val adder = entryGridWidget.createAdder(3)
val worldNameTextEntryWidget = TextFieldWidget(textRenderer, 0, 0, 250, 20, Text.of(levelName))
worldNameTextEntryWidget.setPlaceholder(
Text.translatable(
"worldtools.gui.manager.world_name_placeholder",
levelName
)
)
worldNameTextEntryWidget.setMaxLength(MAX_LEVEL_NAME_LENGTH)

worldNameTextEntryWidget = EnterTextField(
textRenderer, 0, 0, 250, 20, Text.of(levelName), client
).apply {
setPlaceholder(Text.translatable("worldtools.gui.manager.world_name_placeholder", levelName))
setMaxLength(MAX_LEVEL_NAME_LENGTH)
}
downloadButton = createButton("worldtools.gui.manager.button.start_download") {
if (CaptureManager.capturing) {
client?.setScreen(null)
CaptureManager.stop()
} else {
client?.setScreen(null)
CaptureManager.start(worldNameTextEntryWidget.text)
}
}

adder.add(worldNameTextEntryWidget, 2)
adder.add(ButtonWidget.Builder(Text.translatable("worldtools.gui.manager.button.start_download")) { _ ->
client?.setScreen(null)
CaptureManager.start(worldNameTextEntryWidget.text)
}.width(90).build(), 1)
adder.add(downloadButton, 1)

entryGridWidget.refreshPositions()
SimplePositioningWidget.setPos(entryGridWidget, 0, title.y, width, height, 0.5f, 0.05f)
SimplePositioningWidget.setPos(entryGridWidget, 0, titleWidget.y, width, height, 0.5f, 0.05f)
entryGridWidget.forEachChild(this::addDrawableChild)
}

val bottomGridWidget = GridWidget()
bottomGridWidget.mainPositioner.margin(4, 4, 4, 4)
private fun setupBottomGrid() {
val bottomGridWidget = createGridWidget()
val bottomAdder = bottomGridWidget.createAdder(2)
// no mod menu on forge so we need a way to get to the config screen ~somewhere~
val configButton = ButtonWidget.Builder(Text.translatable("worldtools.gui.manager.button.config")) { _ ->
configButton = createButton("worldtools.gui.manager.button.config") {
client?.setScreen(AutoConfig.getConfigScreen(WorldToolsConfig::class.java, this).get())
}.width(90).build()
bottomAdder.add(configButton, 1)

val cancelButton = ButtonWidget.Builder(Text.translatable("worldtools.gui.manager.button.cancel")) { _ ->
}
cancelButton = createButton("worldtools.gui.manager.button.cancel") {
client?.setScreen(null)
}.width(90).build()
}

bottomAdder.add(configButton, 1)
bottomAdder.add(cancelButton, 1)

bottomGridWidget.refreshPositions()
SimplePositioningWidget.setPos(bottomGridWidget, 0, 0, width, height, 0.5f, .95f)
bottomGridWidget.forEachChild(this::addDrawableChild)
}
}

private fun createGridWidget() = GridWidget().apply {
mainPositioner.margin(4, 4, 4, 4)
}

private fun createButton(textKey: String, onClick: (ButtonWidget) -> Unit) =
ButtonWidget.Builder(Text.translatable(textKey), onClick).width(BUTTON_WIDTH).build()
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,15 @@ class CompressLevelStoreable : Storeable {
}

override fun visitFileFailed(file: Path, exc: IOException): FileVisitResult {
MessageManager.sendError("worldtools.error.failed_to_zip", file, exc.localizedMessage)
MessageManager.sendError("worldtools.log.error.failed_to_visit_file", file, exc.localizedMessage)
return FileVisitResult.CONTINUE
}
})
}
}
LOG.info("Finished zipping $rootPath")
} catch (e: IOException) {
MessageManager.sendError("worldtools.error.failed_to_zip", rootPath, e.localizedMessage)
MessageManager.sendError("worldtools.log.error.failed_to_zip", rootPath, e.localizedMessage)
}
}

Expand Down
3 changes: 2 additions & 1 deletion common/src/main/resources/assets/worldtools/lang/de_de.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@
"worldtools.log.error.already_capturing": "Es läuft bereits eine Aufnahme!",
"worldtools.log.error.failed_to_create_session": "Fehler beim Erstellen der Sitzung für \"%s\"! (Error: %s)",
"worldtools.log.error.failed_to_save_level": "Fehler beim Speichern von Level.dat für \"%s\"! (Error: %s)",
"worldtools.log.error.failed_to_zip": "Fehler beim Komprimieren von \"%s\"! (Error: %s)",
"worldtools.log.error.failed_to_visit_file": "Fehler beim Anfragen der Datei \"%s\" um sie zu Komprimieren! (Error: %s)",
"worldtools.log.error.failed_to_zip": "Fehler beim Erstellen einer Sitzung zum Komprimieren von \"%s\"! (Error: %s)",
"worldtools.log.error.not_capturing": "Es läuft noch keine Aufnahme!",
"worldtools.log.error.world_name_too_long": "Weltname \"%s\" darf nicht länger als %d Zeichen sein!",
"worldtools.log.info.started_capture": "Aufnahme von %s gestartet...",
Expand Down
4 changes: 3 additions & 1 deletion common/src/main/resources/assets/worldtools/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
"worldtools.gui.manager.button.cancel": "Cancel",
"worldtools.gui.manager.button.config": "Config",
"worldtools.gui.manager.button.start_download": "Start download",
"worldtools.gui.manager.button.stop_download": "Stop download",
"worldtools.gui.manager.title": "WorldTools Manager",
"worldtools.gui.manager.world_name_placeholder": "Enter world name... (default: %s)",
"worldtools.key.categories": "WorldTools",
Expand All @@ -82,7 +83,8 @@
"worldtools.log.error.already_capturing": "A capture for %s is already running!",
"worldtools.log.error.failed_to_create_session": "Failed to create session for \"%s\"! (error: %s)",
"worldtools.log.error.failed_to_save_level": "Failed to save level.dat for \"%s\"! (error: %s)",
"worldtools.log.error.failed_to_zip": "Failed to zip capture of %s! (error: %s)",
"worldtools.log.error.failed_to_zip": "Failed to create session to zip capture of %s! (error: %s)",
"worldtools.log.error.failed_to_visit_file": "Failed accessing file %s to create a zip! (error: %s)",
"worldtools.log.error.not_capturing": "No capture is running yet!",
"worldtools.log.error.world_name_too_long": "World name \"%s\" is too long! (max %d characters)",
"worldtools.log.info.started_capture": "Started capturing %s...",
Expand Down

0 comments on commit da370fa

Please sign in to comment.