Skip to content

Commit f569ec4

Browse files
Gui by inventory dsl
1 parent 6bb1d38 commit f569ec4

3 files changed

Lines changed: 60 additions & 9 deletions

File tree

invui-kotlin/src/main/kotlin/xyz/xenondevs/invui/dsl/DslProperties.kt

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,19 @@
22

33
package xyz.xenondevs.invui.dsl
44

5-
import org.bukkit.Material
65
import org.bukkit.inventory.ItemStack
76
import xyz.xenondevs.commons.provider.MutableProvider
87
import xyz.xenondevs.commons.provider.Provider
98
import xyz.xenondevs.commons.provider.mapNonNull
109
import xyz.xenondevs.commons.provider.mutableProvider
11-
import xyz.xenondevs.commons.provider.provider
1210
import xyz.xenondevs.invui.ExperimentalReactiveApi
1311
import xyz.xenondevs.invui.gui.Gui
12+
import xyz.xenondevs.invui.inventory.Inventory
1413
import xyz.xenondevs.invui.item.Item
1514
import xyz.xenondevs.invui.item.ItemProvider
1615
import xyz.xenondevs.invui.item.ItemWrapper
1716
import xyz.xenondevs.invui.item.setItemProvider
18-
17+
import kotlin.math.ceil
1918

2019
class ItemDslProperty internal constructor() {
2120

@@ -40,14 +39,45 @@ class ItemDslProperty internal constructor() {
4039

4140
}
4241

43-
class GuiDslProperty internal constructor(width: Int, height: Int) {
42+
internal data class Dimensions(val width: Int, val height: Int) {
43+
val size: Int
44+
get() = width * height
45+
}
46+
47+
class GuiDslProperty internal constructor(
48+
private val dimensions: List<Dimensions>,
49+
defaultGui: Gui = Gui.empty(dimensions[0].width, dimensions[0].height),
50+
private val arbitraryHeight: Boolean = false,
51+
) {
4452

45-
internal var value: Gui = Gui.empty(width, height)
53+
internal var value: Gui = defaultGui
54+
55+
internal constructor(
56+
width: Int, height: Int,
57+
defaultGui: Gui = Gui.empty(width, height),
58+
arbitraryHeight: Boolean = false
59+
) : this(listOf(Dimensions(width, height)), defaultGui, arbitraryHeight)
4660

4761
infix fun by(gui: Gui) {
4862
this.value = gui
4963
}
5064

65+
infix fun by(inventory: Inventory) {
66+
if (arbitraryHeight) {
67+
value = Gui.of(
68+
dimensions[0].width,
69+
ceil(inventory.size / dimensions[0].width.toDouble()).toInt(),
70+
inventory
71+
)
72+
} else {
73+
val dim = dimensions
74+
.filter { it.size >= inventory.size }
75+
.minByOrNull { it.size - inventory.size }
76+
?: dimensions.first()
77+
value = Gui.of(dim.width, dim.height, inventory)
78+
}
79+
}
80+
5181
}
5282

5383
class NullableItemProviderDslProperty internal constructor() : ProviderDslProperty<ItemProvider?>(null) {

invui-kotlin/src/main/kotlin/xyz/xenondevs/invui/dsl/StonecutterWindowDsl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ internal class StonecutterWindowDslImpl(
2626
) : AbstractSplitWindowDsl<StonecutterWindow, StonecutterWindow.Builder>(viewer), StonecutterWindowDsl {
2727

2828
override val upperGui = GuiDslProperty(2, 1)
29-
override val buttonsGui = GuiDslProperty(4, 0)
29+
override val buttonsGui = GuiDslProperty(4, 0, arbitraryHeight = true)
3030
override val selectedSlot = MutableProviderDslProperty(-1)
3131

3232
override fun createBuilder() = StonecutterWindow.builder()

invui-kotlin/src/main/kotlin/xyz/xenondevs/invui/dsl/WindowDsl.kt

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import org.bukkit.entity.Player
77
import org.bukkit.event.inventory.InventoryCloseEvent
88
import xyz.xenondevs.invui.ClickEvent
99
import xyz.xenondevs.invui.ExperimentalReactiveApi
10+
import xyz.xenondevs.invui.internal.util.InventoryUtils
1011
import xyz.xenondevs.invui.window.Window
1112
import xyz.xenondevs.invui.window.setTitle
1213

@@ -100,7 +101,7 @@ internal abstract class AbstractSplitWindowDsl<W : Window, B : Window.Builder.Sp
100101
viewer: Player
101102
) : AbstractWindowDsl<W, B>(viewer), SplitWindowDsl {
102103

103-
override val lowerGui = GuiDslProperty(9, 4)
104+
override val lowerGui = GuiDslProperty(9, 4, InventoryUtils.createPlayerReferencingInventoryGui(viewer))
104105

105106
override fun applyToBuilder(builder: B) {
106107
super.applyToBuilder(builder)
@@ -112,7 +113,18 @@ internal abstract class AbstractSplitWindowDsl<W : Window, B : Window.Builder.Sp
112113
@ExperimentalDslApi
113114
internal class NormalSplitWindowDslImpl(viewer: Player) : AbstractSplitWindowDsl<Window, Window.Builder.Normal.Split>(viewer), NormalSplitWindowDsl {
114115

115-
override val upperGui = GuiDslProperty(9, 6)
116+
override val upperGui = GuiDslProperty(
117+
dimensions = listOf(
118+
Dimensions(9, 6),
119+
Dimensions(9, 5),
120+
Dimensions(9, 4),
121+
Dimensions(9, 3),
122+
Dimensions(9, 2),
123+
Dimensions(9, 1),
124+
Dimensions(5, 1),
125+
Dimensions(3, 3),
126+
)
127+
)
116128

117129
override fun createBuilder() = Window.builder()
118130

@@ -126,7 +138,16 @@ internal class NormalSplitWindowDslImpl(viewer: Player) : AbstractSplitWindowDsl
126138
@ExperimentalDslApi
127139
internal class NormalMergedWindowDslImpl(viewer: Player) : AbstractWindowDsl<Window, Window.Builder.Normal.Merged>(viewer), NormalMergedWindowDsl {
128140

129-
override val gui = GuiDslProperty(9, 10)
141+
override val gui = GuiDslProperty(
142+
dimensions = listOf(
143+
Dimensions(9, 10),
144+
Dimensions(9, 9),
145+
Dimensions(9, 8),
146+
Dimensions(9, 7),
147+
Dimensions(9, 6),
148+
Dimensions(9, 5),
149+
)
150+
)
130151

131152
override fun createBuilder() = Window.mergedBuilder()
132153

0 commit comments

Comments
 (0)