Skip to content
This repository has been archived by the owner on May 12, 2024. It is now read-only.

Commit

Permalink
Added setting copy pasting to GUI
Browse files Browse the repository at this point in the history
  • Loading branch information
Luna5ama committed Sep 16, 2023
1 parent aae6b4d commit f1a46f1
Show file tree
Hide file tree
Showing 19 changed files with 105 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ object TrollClickGui : AbstractTrollGui() {
var posY = 0.0f

for (category in Category.values()) {
val window = ListWindow(this, category.displayName, Component.SettingGroup.CLICK_GUI)
val window = ListWindow(this, category.displayName, Component.UiSettingGroup.CLICK_GUI)
window.forcePosX = posX
window.forcePosY = posY
window.forceWidth = 80.0f
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,20 @@ package dev.luna5ama.trollhack.gui.clickgui.window
import dev.luna5ama.trollhack.gui.IGuiScreen
import dev.luna5ama.trollhack.gui.rgui.windows.SettingWindow
import dev.luna5ama.trollhack.module.AbstractModule
import dev.luna5ama.trollhack.setting.groups.SettingGroup
import dev.luna5ama.trollhack.setting.settings.AbstractSetting

class ModuleSettingWindow(
screen: IGuiScreen,
module: AbstractModule,
) : SettingWindow<AbstractModule>(screen, module.name, module, SettingGroup.NONE) {
override fun getSettingList(): List<AbstractSetting<*>> {
return element.fullSettingList.filter { it.name != "Enabled" }
}
) : SettingWindow<AbstractModule>(screen, module.name, module, UiSettingGroup.NONE) {
override val elementSettingGroup: SettingGroup
get() {
return element.settingGroup
}

override val elementSettingList: List<AbstractSetting<*>>
get() {
return element.fullSettingList.filter { it.name != "Enabled" }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ abstract class AbstractHudElement(
val alwaysListening: Boolean,
enabledByDefault: Boolean,
config: AbstractConfig<out Nameable>
) : BasicWindow(TrollHudGui, name, SettingGroup.HUD_GUI, config),
) : BasicWindow(TrollHudGui, name, UiSettingGroup.HUD_GUI, config),
Alias,
IListenerOwner by ListenerOwner() {

Expand All @@ -51,7 +51,7 @@ abstract class AbstractHudElement(
open val hudHeight get() = 10f

val settingList
get() = GuiConfig.getGroupOrPut(SettingGroup.HUD_GUI.groupName).getGroupOrPut(internalName).getSettings()
get() = GuiConfig.getGroupOrPut(UiSettingGroup.HUD_GUI.groupName).getGroupOrPut(internalName).getSettings()

init {
safeParallelListener<TickEvent.Pre> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ object TrollHudGui : AbstractTrollGui() {
var posY = 0.0f

for (category in AbstractHudElement.Category.values()) {
val window = ListWindow(this, category.displayName, Component.SettingGroup.HUD_GUI)
val window = ListWindow(this, category.displayName, Component.UiSettingGroup.HUD_GUI)
window.forcePosX = posX
window.forcePosY = posY
window.forceWidth = 80.0f
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,20 @@ package dev.luna5ama.trollhack.gui.hudgui.window
import dev.luna5ama.trollhack.gui.IGuiScreen
import dev.luna5ama.trollhack.gui.hudgui.AbstractHudElement
import dev.luna5ama.trollhack.gui.rgui.windows.SettingWindow
import dev.luna5ama.trollhack.setting.groups.SettingGroup
import dev.luna5ama.trollhack.setting.settings.AbstractSetting

class HudSettingWindow(
screen: IGuiScreen,
hudElement: AbstractHudElement,
) : SettingWindow<AbstractHudElement>(screen, hudElement.name, hudElement, SettingGroup.NONE) {
override fun getSettingList(): List<AbstractSetting<*>> {
return element.settingList
}
) : SettingWindow<AbstractHudElement>(screen, hudElement.name, hudElement, UiSettingGroup.NONE) {
override val elementSettingGroup: SettingGroup
get() {
return element.settingGroup
}

override val elementSettingList: List<AbstractSetting<*>>
get() {
return element.settingList
}
}
6 changes: 4 additions & 2 deletions src/main/kotlin/dev/luna5ama/trollhack/gui/rgui/Component.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@ import kotlin.math.max
open class Component(
open val screen: IGuiScreen,
final override val name: CharSequence,
val settingGroup: SettingGroup,
val uiSettingGroup: UiSettingGroup,
val config: AbstractConfig<out Nameable> = GuiConfig
) : Nameable {
override val internalName = rootName.replace(" ", "")

val settingGroup get() = config.getGroupOrPut(uiSettingGroup.groupName).getGroupOrPut(internalName)

// Basic info
protected val visibleSetting = setting("Visible", true, { false }, { _, it -> it || !closeable })
var visible by visibleSetting
Expand Down Expand Up @@ -234,7 +236,7 @@ open class Component(

open fun onPostRender(absolutePos: Vec2f) {}

enum class SettingGroup(val groupName: String) {
enum class UiSettingGroup(val groupName: String) {
NONE(""),
CLICK_GUI("click_gui"),
HUD_GUI("hud_gui")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import dev.luna5ama.trollhack.util.math.vector.Vec2f
open class InteractiveComponent(
screen: IGuiScreen,
name: CharSequence,
settingGroup: SettingGroup,
uiSettingGroup: UiSettingGroup,
config: AbstractConfig<out Nameable> = GuiConfig
) : Component(screen, name, settingGroup, config) {
) : Component(screen, name, uiSettingGroup, config) {

// Interactive info
protected var lastMousePos = Vec2f.ZERO
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ import kotlin.math.min
open class WindowComponent(
screen: IGuiScreen,
name: CharSequence,
settingGroup: SettingGroup,
uiSettingGroup: UiSettingGroup,
config: AbstractConfig<out Nameable>
) : InteractiveComponent(screen, name, settingGroup, config) {
) : InteractiveComponent(screen, name, uiSettingGroup, config) {

// Basic info
private val minimizedSetting = setting("Minimized", false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ open class Slider(
name: CharSequence,
private val description: CharSequence = "",
private val visibility: (() -> Boolean)?
) : InteractiveComponent(screen, name, SettingGroup.NONE) {
) : InteractiveComponent(screen, name, UiSettingGroup.NONE) {

override var posY: Float
get() = if (!visible) super.posY + 100.0f else super.posY
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ import dev.luna5ama.trollhack.util.math.vector.Vec2f
open class BasicWindow(
screen: IGuiScreen,
name: CharSequence,
settingGroup: SettingGroup,
uiSettingGroup: UiSettingGroup,
config: AbstractConfig<out Nameable> = GuiConfig
) : CleanWindow(name, screen, settingGroup, config) {
) : CleanWindow(name, screen, uiSettingGroup, config) {
override fun onRender(absolutePos: Vec2f) {
super.onRender(absolutePos)
WindowBlurShader.render(renderWidth, renderHeight)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ import dev.luna5ama.trollhack.util.interfaces.Nameable
open class CleanWindow(
name: CharSequence,
screen: IGuiScreen,
settingGroup: SettingGroup,
uiSettingGroup: UiSettingGroup,
config: AbstractConfig<out Nameable> = GuiConfig
) : WindowComponent(screen, name, settingGroup, config)
) : WindowComponent(screen, name, uiSettingGroup, config)
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class ColorPicker(
) : TitledWindow(
screen,
"Color Picker",
SettingGroup.NONE
UiSettingGroup.NONE
) {
override val resizable: Boolean get() = false
override val minimizable: Boolean get() = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import dev.luna5ama.trollhack.util.math.vector.Vec2f
class DockingOverlay(screen: IGuiScreen, private val parent: WindowComponent) : WindowComponent(
screen,
"Docking Overlay",
SettingGroup.NONE,
UiSettingGroup.NONE,
GuiConfig
) {
override var posX: Float
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import kotlin.math.pow
open class ListWindow(
screen: IGuiScreen,
name: CharSequence,
saveToConfig: SettingGroup,
saveToConfig: UiSettingGroup,
vararg childrenIn: Component
) : TitledWindow(screen, name, saveToConfig) {
val children = ArrayList<Component>()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
package dev.luna5ama.trollhack.gui.rgui.windows

import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import dev.luna5ama.trollhack.TrollHackMod
import dev.luna5ama.trollhack.gui.IGuiScreen
import dev.luna5ama.trollhack.gui.rgui.component.*
import dev.luna5ama.trollhack.module.modules.client.GuiSetting
import dev.luna5ama.trollhack.setting.groups.SettingGroup
import dev.luna5ama.trollhack.setting.settings.AbstractSetting
import dev.luna5ama.trollhack.setting.settings.impl.number.NumberSetting
import dev.luna5ama.trollhack.setting.settings.impl.other.BindSetting
import dev.luna5ama.trollhack.setting.settings.impl.other.ColorSetting
import dev.luna5ama.trollhack.setting.settings.impl.primitive.BooleanSetting
import dev.luna5ama.trollhack.setting.settings.impl.primitive.EnumSetting
import dev.luna5ama.trollhack.setting.settings.impl.primitive.StringSetting
import dev.luna5ama.trollhack.util.ClipboardUtils
import dev.luna5ama.trollhack.util.math.vector.Vec2f
import dev.luna5ama.trollhack.util.text.NoSpamMessage
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap
import org.lwjgl.input.Keyboard
import kotlin.math.max
Expand All @@ -20,16 +26,17 @@ abstract class SettingWindow<T : Any>(
screen: IGuiScreen,
name: CharSequence,
val element: T,
settingGroup: SettingGroup
) : ListWindow(screen, name, settingGroup) {
uiSettingGroup: UiSettingGroup
) : ListWindow(screen, name, uiSettingGroup) {

override val minWidth get() = max(super.minWidth, optimalWidth)
override val minHeight by ::optimalHeight
override val maxHeight by ::optimalHeight

override val minimizable get() = false

protected abstract fun getSettingList(): List<AbstractSetting<*>>
protected abstract val elementSettingGroup: SettingGroup
protected abstract val elementSettingList: List<AbstractSetting<*>>

private val colorPickers = Object2ObjectOpenHashMap<ColorSetting, ColorPicker>()
private var activeColorPicker: ColorPicker? = null
Expand All @@ -48,7 +55,7 @@ abstract class SettingWindow<T : Any>(
screen.lastClicked = this

children.clear()
for (setting in getSettingList()) {
for (setting in elementSettingList) {
when (setting) {
is BooleanSetting -> SettingButton(screen, setting)
is NumberSetting -> SettingSlider(screen, setting)
Expand Down Expand Up @@ -119,6 +126,34 @@ abstract class SettingWindow<T : Any>(
}

override fun onKeyInput(keyCode: Int, keyState: Boolean) {
keybordListening?.onKeyInput(keyCode, keyState)
val listening = keybordListening
if (listening != null) {
listening.onKeyInput(keyCode, keyState)
} else {
if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
try {
when (keyCode) {
Keyboard.KEY_C -> {
val jsonString = gson.toJson(elementSettingGroup.write())
ClipboardUtils.copyToClipboard(jsonString)
}
Keyboard.KEY_V -> {
val jsonString = ClipboardUtils.pasteFromClipboard()
if (jsonString.isNotBlank()) {
val jsonObject = gson.fromJson(jsonString, JsonObject::class.java)
elementSettingGroup.read(jsonObject)
}
}
}
} catch (e: Exception) {
NoSpamMessage.sendError("Failed to copy/paste settings")
TrollHackMod.logger.error("Failed to copy/paste settings", e)
}
}
}
}

private companion object {
val gson = GsonBuilder().setPrettyPrinting().create()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import net.minecraft.util.text.TextFormatting
open class TitledWindow(
screen: IGuiScreen,
name: CharSequence,
settingGroup: SettingGroup
) : BasicWindow(screen, name, settingGroup) {
uiSettingGroup: UiSettingGroup
) : BasicWindow(screen, name, uiSettingGroup) {
override val draggableHeight: Float get() = MainFontRenderer.getHeight() + 6.0f

override val minimizable get() = true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ open class AbstractModule(
DISABLE(TranslateType.COMMON commonKey "Disable")
}

val settingGroup get() = config.getGroupOrPut(this.internalName)
val fullSettingList get() = config.getSettings(this)
val settingList: List<AbstractSetting<*>> get() = fullSettingList.filter { it != bind && it != enabled && it != enabled && it != visible && it != default }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ internal object GuiConfig : AbstractConfig<Component>(
override val backup get() = File("$filePath/${Configurations.guiPreset}.bak")

override fun addSettingToConfig(owner: Component, setting: AbstractSetting<*>) {
val groupName = owner.settingGroup.groupName
val groupName = owner.uiSettingGroup.groupName
if (groupName.isNotEmpty()) {
getGroupOrPut(groupName).getGroupOrPut(owner.internalName).addSetting(setting)
}
Expand Down
19 changes: 19 additions & 0 deletions src/main/kotlin/dev/luna5ama/trollhack/util/ClipboardUtils.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package dev.luna5ama.trollhack.util

import java.awt.Toolkit
import java.awt.datatransfer.DataFlavor
import java.awt.datatransfer.StringSelection

object ClipboardUtils {
fun copyToClipboard(text: String) {
val clipboard = Toolkit.getDefaultToolkit().systemClipboard
val selection = StringSelection(text)
clipboard.setContents(selection, selection)
}

fun pasteFromClipboard(): String {
val clipboard = Toolkit.getDefaultToolkit().systemClipboard
val data = clipboard.getData(DataFlavor.stringFlavor)
return data as String? ?: ""
}
}

0 comments on commit f1a46f1

Please sign in to comment.