Skip to content

Commit

Permalink
Inline functions
Browse files Browse the repository at this point in the history
  • Loading branch information
Matt-MX committed Oct 8, 2022
1 parent f799ac8 commit d0c61ae
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 42 deletions.
14 changes: 6 additions & 8 deletions src/main/java/com/mattmx/ktgui/examples/JavaGuiExample.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,11 @@ public JavaGuiExample() {
.childOf(this);
new GuiToggleButton(
new ItemBuilder(Material.LIME_STAINED_GLASS_PANE).name("&aEnabled").make(),
new ItemBuilder(Material.RED_STAINED_GLASS_PANE).name("&cDisabled").make(),
false,
(button, event, value) -> {
event.getWhoClicked().sendMessage(Chat.INSTANCE.format(
"&#7f52ffJust a quick example to show that all functionality is 1:1 from KtGui -> Java. (" + value + ")",
(Player) event.getWhoClicked()));
return null;
}).slot(22).childOf(this);
new ItemBuilder(Material.RED_STAINED_GLASS_PANE).name("&cDisabled").make()
).onChange(e -> {
e.getPlayer().sendMessage(Chat.INSTANCE.format(
"&#7f52ffJust a quick example to show that all functionality is 1:1 from KtGui -> Java. (" + ((GuiToggleButton) e.getButton()).enabled() + ")", e.getPlayer()));
return null;
}).slot(22).childOf(this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.mattmx.ktgui.components.button

import org.bukkit.entity.Player
import org.bukkit.event.inventory.InventoryClickEvent

data class ButtonClickedEvent(
val player: Player,
val event: InventoryClickEvent,
val button: IGuiButton
)
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,32 @@ import org.bukkit.inventory.ItemStack
class GuiCycleButton(
material: Material = Material.STONE,
item: ItemStack? = null,
protected val map: MutableMap<String, ItemStack>,
protected var selected: Int = 0,
protected var changed: ((GuiCycleButton, InventoryClickEvent?) -> Unit)? = null
) : GuiButton(
material, item
) {
protected val map: MutableMap<String, ItemStack> = mutableMapOf()
protected var selected: Int = 0
protected var changed: ((ButtonClickedEvent) -> Unit)? = null

init {
click {
right = { e ->
nextItem(e.whoClicked as Player)
changed?.invoke(this@GuiCycleButton, e)
changed?.invoke(ButtonClickedEvent(e.whoClicked as Player, e, this@GuiCycleButton))
}
left = { e ->
prevItem(e.whoClicked as Player)
changed?.invoke(this@GuiCycleButton, e)
changed?.invoke(ButtonClickedEvent(e.whoClicked as Player, e, this@GuiCycleButton))
}
}
this.item = getSelectedItem()
}

fun items(items: MutableMap<String, ItemStack>.() -> Unit) : GuiCycleButton {
items(map)
return this
}

fun getSelectedId() : String? {
return map.keys.toMutableList().getOrNull(selected)
}
Expand All @@ -54,13 +59,14 @@ class GuiCycleButton(
update(player)
}

fun changed(cb: (GuiCycleButton, InventoryClickEvent?) -> Unit): GuiCycleButton {
fun changed(cb: ButtonClickedEvent.() -> Unit): GuiCycleButton {
changed = cb
return this
}

override fun copy(parent: IGuiScreen): GuiButton {
val copy = GuiCycleButton(map = map)
val copy = GuiCycleButton()
copy.map.putAll(map)
copy.notClicked = notClicked
copy.changed = changed
copy.parent = parent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,36 @@ import org.bukkit.inventory.ItemStack
open class GuiToggleButton(
val enabledItem: ItemStack,
val disabledItem: ItemStack,
var default: Boolean = false,
var onChange: ((GuiToggleButton, InventoryClickEvent?, Boolean) -> Unit)? = null
) : GuiButton() {

private var current = default
private var current = false
var changed: ((ButtonClickedEvent) -> Unit)? = null

init {
this.item = if (default) enabledItem else disabledItem
this.item = if (current) enabledItem else disabledItem
}

override fun thisClicked(e: InventoryClickEvent) {
changeState(e.whoClicked as Player, e)
super.thisClicked(e)
}

fun onChange(cb: (GuiToggleButton, InventoryClickEvent?, Boolean) -> Unit): GuiToggleButton {
onChange = cb
fun enabledOnDefault(state: Boolean) : GuiToggleButton {
current = state
return this
}

inline fun onChange(noinline cb: ButtonClickedEvent.() -> Unit): GuiToggleButton {
changed = cb
return this
}

fun changeState(player: Player, e: InventoryClickEvent? = null) {
fun enabled() : Boolean {
return current
}

fun changeState(player: Player, e: InventoryClickEvent) {
setState(!current, player)
onChange?.invoke(this, e, current)
changed?.invoke(ButtonClickedEvent(player, e, this))
}

fun setState(value: Boolean, player: Player) {
Expand All @@ -40,7 +47,9 @@ open class GuiToggleButton(
}

override fun copy(parent: IGuiScreen): GuiToggleButton {
val button = GuiToggleButton(enabledItem, disabledItem, default, onChange)
val button = GuiToggleButton(enabledItem, disabledItem)
button.current = current
button.changed = changed
button.parent = parent
return button
}
Expand Down
26 changes: 13 additions & 13 deletions src/main/kotlin/com/mattmx/ktgui/examples/ConfigScreenExample.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@ class ConfigScreenExample : GuiScreen("Example Config", 3) {
*/
GuiToggleButton(
enabled.copy().lore("&8This is item $it").make(),
disabled.copy().lore("&8This is item $it").make(),
false
) { _, e, s ->
e?.whoClicked?.sendMessage(Chat.color("&cChanged button $it! ($s)"))
} childOf this slot slot
disabled.copy().lore("&8This is item $it").make())
.enabledOnDefault(true)
.onChange {
player.sendMessage(Chat.color("&cChanged button ${it}! (${(button as GuiToggleButton).enabled()})"))
}
slot += 2
}
/**
Expand All @@ -34,14 +34,14 @@ class ConfigScreenExample : GuiScreen("Example Config", 3) {
*
* Provide a MutableMap<String, ItemStack> on initialization.
*/
GuiCycleButton(
map = mutableMapOf(
"dirt" to ItemBuilder(Material.DIRT).name("&6Dirt").lore("&8Click to cycle").make(),
"grass_block" to ItemBuilder(Material.GRASS_BLOCK).lore("&8Click to cycle").name("&6Grass Block")
.make(),
"diamond" to ItemBuilder(Material.DIAMOND_BLOCK).lore("&8Click to cycle").name("&bDiamond Block").make()
)
) childOf this slot 10
GuiCycleButton()
.items {
this["dirt"] = ItemBuilder(Material.DIRT).name("&6Dirt").lore("&8Click to cycle").make()
this["grass_block"] = ItemBuilder(Material.GRASS_BLOCK).lore("&8Click to cycle").name("&6Grass Block").make()
this["diamond"] to ItemBuilder(Material.DIAMOND_BLOCK).lore("&8Click to cycle").name("&bDiamond Block").make()
}.changed {
player.sendMessage(Chat.color("&7You changed to ${(button as GuiCycleButton).getSelectedId()}"))
} childOf this slot 10
/**
* You may want to allow the user to read all options instead
* of having to cycle through them all to find them.
Expand Down
7 changes: 3 additions & 4 deletions src/main/kotlin/com/mattmx/ktgui/examples/CustomGUI.kt
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,9 @@ class CustomGUI : GuiScreen("&8&l⤷ &#7f52ffK&#984fd8t&#b14bb1G&#c94889u&#e2446
GuiToggleButton(
ItemBuilder(Material.LIME_STAINED_GLASS_PANE).name("&aEnabled").lore("&8Click to toggle").make(),
ItemBuilder(Material.RED_STAINED_GLASS_PANE).name("&cDisabled").lore("&8Click to toggle").make(),
onChange = { button, event, state ->
event?.whoClicked?.sendMessage(Chat.format("&8&l⤷ &#7f52ffToggled thing to $state"))
}
) slot 10 childOf this
).onChange {
player.sendMessage(Chat.format("&8&l⤷ &#7f52ffToggled thing to ${(button as GuiToggleButton).enabled()}"))
} slot 10 childOf this
/**
* Random example of using callbacks to do different things
*/
Expand Down

0 comments on commit d0c61ae

Please sign in to comment.