Skip to content

Commit 0cd878c

Browse files
Make ProviderDslProperties snapshots
The `by` function on dsl properties is intended as an overloadable replacement to the assignment operator. Retrieving a ProviderDslProperty is now more similar to a var field, as it captures the currently configured provider and does not change after that. This also allows using delegation for the implementation of ProviderDslProperty again.
1 parent 0d1e257 commit 0cd878c

14 files changed

Lines changed: 175 additions & 265 deletions

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package xyz.xenondevs.invui.dsl
55
import org.bukkit.entity.Player
66
import xyz.xenondevs.commons.provider.Provider
77
import xyz.xenondevs.commons.provider.mutableProvider
8+
import xyz.xenondevs.commons.provider.provider
89
import xyz.xenondevs.invui.ExperimentalReactiveApi
910
import xyz.xenondevs.invui.dsl.property.GuiDslProperty
1011
import xyz.xenondevs.invui.dsl.property.ProviderDslProperty
@@ -32,10 +33,15 @@ internal class AnvilWindowDslImpl(
3233
viewer: Player
3334
) : AbstractSplitWindowDsl<AnvilWindow, AnvilWindow.Builder>(viewer), AnvilWindowDsl {
3435

36+
private var _textFieldAlwaysEnabled = provider(true)
37+
private var _resultAlwaysValid = provider(false)
38+
3539
override val upperGui = GuiDslProperty(3, 1)
3640
override val text = mutableProvider("")
37-
override val textFieldAlwaysEnabled = ProviderDslProperty(true)
38-
override val resultAlwaysValid = ProviderDslProperty(false)
41+
override val textFieldAlwaysEnabled: ProviderDslProperty<Boolean>
42+
get() = ProviderDslProperty(::_textFieldAlwaysEnabled)
43+
override val resultAlwaysValid: ProviderDslProperty<Boolean>
44+
get() = ProviderDslProperty(::_resultAlwaysValid)
3945

4046
override fun createBuilder() = AnvilWindow.builder()
4147

@@ -44,8 +50,8 @@ internal class AnvilWindowDslImpl(
4450
builder.apply {
4551
setUpperGui(upperGui.value)
4652
addRenameHandler(text)
47-
setTextFieldAlwaysEnabled(textFieldAlwaysEnabled.delegate)
48-
setResultAlwaysValid(resultAlwaysValid.delegate)
53+
setTextFieldAlwaysEnabled(_textFieldAlwaysEnabled)
54+
setResultAlwaysValid(_resultAlwaysValid)
4955
}
5056
}
5157

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package xyz.xenondevs.invui.dsl
44

55
import org.bukkit.entity.Player
6+
import xyz.xenondevs.commons.provider.provider
67
import xyz.xenondevs.invui.ExperimentalReactiveApi
78
import xyz.xenondevs.invui.dsl.property.GuiDslProperty
89
import xyz.xenondevs.invui.dsl.property.ProviderDslProperty
@@ -30,11 +31,16 @@ internal class BrewingWindowDslImpl(
3031
viewer: Player
3132
) : AbstractSplitWindowDsl<BrewingWindow, BrewingWindow.Builder>(viewer), BrewingWindowDsl {
3233

34+
private var _brewProgress = provider(0.0)
35+
private var _fuelProgress = provider(0.0)
36+
3337
override val inputGui = GuiDslProperty(1, 1)
3438
override val fuelGui = GuiDslProperty(1, 1)
3539
override val resultGui = GuiDslProperty(3, 1)
36-
override val brewProgress = ProviderDslProperty(0.0)
37-
override val fuelProgress = ProviderDslProperty(0.0)
40+
override val brewProgress: ProviderDslProperty<Double>
41+
get() = ProviderDslProperty(::_brewProgress)
42+
override val fuelProgress: ProviderDslProperty<Double>
43+
get() = ProviderDslProperty(::_fuelProgress)
3844

3945
override fun createBuilder() = BrewingWindow.builder()
4046

@@ -44,8 +50,8 @@ internal class BrewingWindowDslImpl(
4450
setInputGui(inputGui.value)
4551
setFuelGui(fuelGui.value)
4652
setResultGui(resultGui.value)
47-
setBrewProgress(brewProgress.delegate)
48-
setFuelProgress(fuelProgress.delegate)
53+
setBrewProgress(_brewProgress)
54+
setFuelProgress(_fuelProgress)
4955
}
5056
}
5157

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package xyz.xenondevs.invui.dsl
44

55
import org.bukkit.entity.Player
6+
import xyz.xenondevs.commons.provider.provider
67
import xyz.xenondevs.invui.ExperimentalReactiveApi
78
import xyz.xenondevs.invui.dsl.property.GuiDslProperty
89
import xyz.xenondevs.invui.dsl.property.ProviderDslProperty
@@ -31,10 +32,15 @@ internal class CartographyWindowDslImpl(
3132
viewer: Player
3233
) : AbstractSplitWindowDsl<CartographyWindow, CartographyWindow.Builder>(viewer), CartographyWindowDsl {
3334

35+
private var _icons = provider(emptySet<CartographyWindow.MapIcon>())
36+
private var _view = provider(CartographyWindow.View.NORMAL)
37+
3438
override val inputGui = GuiDslProperty(1, 2)
3539
override val resultGui = GuiDslProperty(1, 1)
36-
override val icons = ProviderDslProperty(emptySet<CartographyWindow.MapIcon>())
37-
override val view = ProviderDslProperty(CartographyWindow.View.NORMAL)
40+
override val icons: ProviderDslProperty<Set<CartographyWindow.MapIcon>>
41+
get() = ProviderDslProperty(::_icons)
42+
override val view: ProviderDslProperty<CartographyWindow.View>
43+
get() = ProviderDslProperty(::_view)
3844

3945
override fun createBuilder() = CartographyWindow.builder()
4046

@@ -43,8 +49,8 @@ internal class CartographyWindowDslImpl(
4349
builder.apply {
4450
setInputGui(inputGui.value)
4551
setResultGui(resultGui.value)
46-
setIcons(icons.delegate)
47-
setView(view.delegate)
52+
setIcons(_icons)
53+
setView(_view)
4854
}
4955
}
5056

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package xyz.xenondevs.invui.dsl
44

55
import org.bukkit.entity.Player
6+
import xyz.xenondevs.commons.provider.provider
67
import xyz.xenondevs.invui.ExperimentalReactiveApi
78
import xyz.xenondevs.invui.dsl.property.GuiDslProperty
89
import xyz.xenondevs.invui.dsl.property.ProviderDslProperty
@@ -31,10 +32,15 @@ internal class FurnaceWindowDslImpl(
3132
viewer: Player
3233
) : AbstractSplitWindowDsl<FurnaceWindow, FurnaceWindow.Builder>(viewer), FurnaceWindowDsl {
3334

35+
private var _cookProgress = provider(0.0)
36+
private var _burnProgress = provider(0.0)
37+
3438
override val inputGui = GuiDslProperty(1, 2)
3539
override val resultGui = GuiDslProperty(1, 1)
36-
override val cookProgress = ProviderDslProperty(0.0)
37-
override val burnProgress = ProviderDslProperty(0.0)
40+
override val cookProgress: ProviderDslProperty<Double>
41+
get() = ProviderDslProperty(::_cookProgress)
42+
override val burnProgress: ProviderDslProperty<Double>
43+
get() = ProviderDslProperty(::_burnProgress)
3844
private val recipeClickHandlers = mutableListOf<RecipeClickDsl.() -> Unit>()
3945

4046
override fun onRecipeClick(handler: RecipeClickDsl.() -> Unit) {
@@ -48,8 +54,8 @@ internal class FurnaceWindowDslImpl(
4854
builder.apply {
4955
setInputGui(inputGui.value)
5056
setResultGui(resultGui.value)
51-
setCookProgress(cookProgress.delegate)
52-
setBurnProgress(burnProgress.delegate)
57+
setCookProgress(_cookProgress)
58+
setBurnProgress(_burnProgress)
5359
for (handler in recipeClickHandlers) {
5460
addRecipeClickHandler { RecipeClickDslImpl(it).handler() }
5561
}

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
package xyz.xenondevs.invui.dsl
44

5+
import xyz.xenondevs.commons.provider.provider
56
import xyz.xenondevs.invui.ExperimentalReactiveApi
67
import xyz.xenondevs.invui.dsl.property.ProviderDslProperty
78
import xyz.xenondevs.invui.gui.Gui
@@ -32,9 +33,16 @@ internal abstract class GuiDslImpl<G : Gui, B : Gui.Builder<G, B>>(
3233
presets: List<IngredientPreset>
3334
) : IngredientsDslImpl(presets), GuiDsl {
3435

35-
override val background = ProviderDslProperty<ItemProvider?>(null)
36-
override val frozen = ProviderDslProperty(false)
37-
override val ignoreObscuredInventorySlots = ProviderDslProperty(false)
36+
private var _background = provider<ItemProvider?>(null)
37+
private var _frozen = provider(false)
38+
private var _ignoreObscuredInventorySlots = provider(false)
39+
40+
override val background: ProviderDslProperty<ItemProvider?>
41+
get() = ProviderDslProperty(::_background)
42+
override val frozen: ProviderDslProperty<Boolean>
43+
get() = ProviderDslProperty(::_frozen)
44+
override val ignoreObscuredInventorySlots: ProviderDslProperty<Boolean>
45+
get() = ProviderDslProperty(::_ignoreObscuredInventorySlots)
3846

3947
fun build(): G = createBuilder().apply(::applyToBuilder).build()
4048

@@ -46,9 +54,9 @@ internal abstract class GuiDslImpl<G : Gui, B : Gui.Builder<G, B>>(
4654
}
4755
applyPreset(ingredients.build())
4856

49-
setBackground(background.delegate)
50-
setFrozen(frozen.delegate)
51-
setIgnoreObscuredInventorySlots(ignoreObscuredInventorySlots.delegate)
57+
setBackground(_background)
58+
setFrozen(_frozen)
59+
setIgnoreObscuredInventorySlots(_ignoreObscuredInventorySlots)
5260
}
5361
}
5462

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package xyz.xenondevs.invui.dsl
55
import org.bukkit.entity.Player
66
import org.bukkit.event.inventory.ClickType
77
import xyz.xenondevs.commons.provider.Provider
8+
import xyz.xenondevs.commons.provider.provider
89
import xyz.xenondevs.invui.Click
910
import xyz.xenondevs.invui.ExperimentalReactiveApi
1011
import xyz.xenondevs.invui.dsl.property.ProviderDslProperty
@@ -51,7 +52,10 @@ sealed interface ItemDsl {
5152
@ExperimentalDslApi
5253
internal class ItemDslImpl : ItemDsl {
5354

54-
override val itemProvider = ProviderDslProperty(ItemProvider.EMPTY)
55+
private var _itemProvider = provider(ItemProvider.EMPTY)
56+
57+
override val itemProvider: ProviderDslProperty<ItemProvider>
58+
get() = ProviderDslProperty(::_itemProvider)
5559
private val clickHandlers = mutableListOf<ClickDsl.() -> Unit>()
5660
private val bundleSelectHandlers = mutableListOf<BundleSelectDsl.() -> Unit>()
5761

@@ -65,8 +69,8 @@ internal class ItemDslImpl : ItemDsl {
6569

6670
fun build(): Item {
6771
if (clickHandlers.isEmpty() && bundleSelectHandlers.isEmpty())
68-
return simpleOrConstItem(itemProvider.delegate)
69-
return DslItemImpl(itemProvider.delegate, clickHandlers.toList(), bundleSelectHandlers.toList())
72+
return simpleOrConstItem(_itemProvider)
73+
return DslItemImpl(_itemProvider, clickHandlers.toList(), bundleSelectHandlers.toList())
7074
}
7175

7276
}

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

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import io.papermc.paper.datacomponent.item.TooltipDisplay.tooltipDisplay
88
import net.kyori.adventure.text.Component
99
import org.bukkit.inventory.ItemStack
1010
import org.bukkit.inventory.ItemType
11+
import xyz.xenondevs.commons.provider.NULL_PROVIDER
1112
import xyz.xenondevs.commons.provider.Provider
1213
import xyz.xenondevs.commons.provider.combinedProvider
1314
import xyz.xenondevs.commons.provider.provider
@@ -53,13 +54,13 @@ sealed interface DataComponentsPatchDsl {
5354
@ExperimentalDslApi
5455
internal class DataComponentsPatchImpl : DataComponentsPatchDsl {
5556

56-
val components = mutableMapOf<DataComponentType, ProviderDslProperty<*>>()
57+
val components = mutableMapOf<DataComponentType, Provider<*>>()
5758

5859
override fun <T : Any> get(type: DataComponentType.Valued<T>): ProviderDslProperty<T?> =
59-
components.getOrPut(type) { ProviderDslProperty<T?>(null) } as ProviderDslProperty<T?>
60+
ProviderDslProperty<T?>(components[type] as? Provider<T> ?: NULL_PROVIDER) { components[type] = it }
6061

6162
override fun <T : Any> get(type: DataComponentType.NonValued): ProviderDslProperty<Boolean?> =
62-
components.getOrPut(type) { ProviderDslProperty<Boolean?>(null) } as ProviderDslProperty<Boolean?>
63+
ProviderDslProperty<Boolean?>(components[type] as? Provider<Boolean> ?: NULL_PROVIDER) { components[type] = it }
6364

6465
}
6566

@@ -68,20 +69,32 @@ internal class ItemProviderDslImpl(
6869
private val base: Provider<ItemStack>
6970
) : ItemProviderDsl {
7071

71-
override val type = ProviderDslProperty<ItemType?>(null)
72-
override val amount = ProviderDslProperty<Int?>(null)
72+
private var _type = provider<ItemType?>(null)
73+
private var _amount = provider<Int?>(null)
74+
private var _lore = provider<List<Component>?>(null)
75+
private var _hasTooltip = provider<Boolean?>(null)
76+
7377
override val data = DataComponentsPatchImpl()
7478

75-
override val name = data[DataComponentTypes.ITEM_NAME]
76-
override val customName = data[DataComponentTypes.CUSTOM_NAME]
77-
override val lore = ProviderDslProperty<List<Component>?>(null)
78-
override val hasGlint = data[DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE]
79-
override val hasTooltip = ProviderDslProperty<Boolean?>(null)
79+
override val type: ProviderDslProperty<ItemType?>
80+
get() = ProviderDslProperty(::_type)
81+
override val amount: ProviderDslProperty<Int?>
82+
get() = ProviderDslProperty(::_amount)
83+
override val lore: ProviderDslProperty<List<Component>?>
84+
get() = ProviderDslProperty(::_lore)
85+
override val hasTooltip: ProviderDslProperty<Boolean?>
86+
get() = ProviderDslProperty(::_hasTooltip)
87+
override val name: ProviderDslProperty<Component?>
88+
get() = data[DataComponentTypes.ITEM_NAME]
89+
override val customName: ProviderDslProperty<Component?>
90+
get() = data[DataComponentTypes.CUSTOM_NAME]
91+
override val hasGlint: ProviderDslProperty<Boolean?>
92+
get() = data[DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE]
8093

8194
fun build(): Provider<ItemProvider> {
8295
val dataTypeProviders = data.components.map { (type, dslProperty) -> dslProperty.map { type to it } }
8396
return combinedProvider(
84-
base, type, amount, lore, hasTooltip, combinedProvider(dataTypeProviders)
97+
base, _type, _amount, _lore, _hasTooltip, combinedProvider(dataTypeProviders)
8598
) { base, type, amount, lore, hasTooltip, dataTypes ->
8699
var result = base.clone()
87100

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

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package xyz.xenondevs.invui.dsl
55
import org.bukkit.entity.Player
66
import xyz.xenondevs.commons.provider.Provider
77
import xyz.xenondevs.commons.provider.mutableProvider
8+
import xyz.xenondevs.commons.provider.provider
89
import xyz.xenondevs.invui.ExperimentalReactiveApi
910
import xyz.xenondevs.invui.dsl.property.GuiDslProperty
1011
import xyz.xenondevs.invui.dsl.property.ItemDslProperty
@@ -48,8 +49,11 @@ internal class MerchantWindowDslImpl(
4849
viewer: Player
4950
) : AbstractSplitWindowDsl<MerchantWindow, MerchantWindow.Builder>(viewer), MerchantWindowDsl {
5051

52+
private var _trades = provider(emptyList<MerchantWindow.Trade>())
53+
5154
override val upperGui = GuiDslProperty(3, 1)
52-
override val trades = ProviderDslProperty(emptyList<MerchantWindow.Trade>())
55+
override val trades: ProviderDslProperty<List<MerchantWindow.Trade>>
56+
get() = ProviderDslProperty(::_trades)
5357
override val selectedTrade = mutableProvider(-1)
5458

5559
override fun createBuilder() = MerchantWindow.builder()
@@ -58,7 +62,7 @@ internal class MerchantWindowDslImpl(
5862
super.applyToBuilder(builder)
5963
builder.apply {
6064
setUpperGui(upperGui.value)
61-
setTrades(trades.delegate)
65+
setTrades(_trades)
6266
addTradeSelectHandler { _, trade -> selectedTrade.set(trade) }
6367
}
6468
}
@@ -68,18 +72,23 @@ internal class MerchantWindowDslImpl(
6872
@ExperimentalDslApi
6973
internal class TradeDslImpl : TradeDsl {
7074

75+
private var _discount = provider(0)
76+
private var _isAvailable = provider(true)
77+
7178
override val firstInput = ItemDslProperty()
7279
override val secondInput = ItemDslProperty()
7380
override val result = ItemDslProperty()
74-
override val discount = ProviderDslProperty(0)
75-
override val isAvailable = ProviderDslProperty(true)
81+
override val discount: ProviderDslProperty<Int>
82+
get() = ProviderDslProperty(::_discount)
83+
override val isAvailable: ProviderDslProperty<Boolean>
84+
get() = ProviderDslProperty(::_isAvailable)
7685

7786
fun build() = MerchantWindow.Trade.builder()
7887
.setFirstInput(firstInput.value)
7988
.setSecondInput(secondInput.value)
8089
.setResult(result.value)
81-
.setDiscount(discount.delegate)
82-
.setAvailable(isAvailable.delegate)
90+
.setDiscount(_discount)
91+
.setAvailable(_isAvailable)
8392
.build()
8493

8594
}

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,20 @@ internal abstract class PagedGuiDslImpl<C : Any>(
4747

4848
private val internalPageCount = mutableProvider { provider(0) }
4949

50-
override val content = ProviderDslProperty(emptyList<C>())
51-
override val page = MutableProviderDslProperty(0)
50+
private var _content = provider(emptyList<C>())
51+
private var _page = mutableProvider(0)
52+
53+
override val content: ProviderDslProperty<List<C>>
54+
get() = ProviderDslProperty(::_content)
55+
override val page: MutableProviderDslProperty<Int>
56+
get() = MutableProviderDslProperty(::_page)
5257
override val pageCount = internalPageCount.flatten()
5358

5459
override fun applyToBuilder(builder: PagedGui.Builder<C>) {
5560
super.applyToBuilder(builder)
5661
builder.apply {
57-
setContent(content.delegate)
58-
setPage(page.delegate)
62+
setContent(_content)
63+
setPage(_page)
5964
addModifier { internalPageCount.set(it.pageCountProvider) }
6065
}
6166
}

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,21 @@ internal abstract class ScrollGuiDslImpl<C : Any>(
5050
private val internalLineCount = mutableProvider { provider(0) }
5151
private val internalMaxLine = mutableProvider { provider(0) }
5252

53-
override val content = ProviderDslProperty(emptyList<C>())
54-
override val line = MutableProviderDslProperty(0)
53+
private var _content = provider(emptyList<C>())
54+
private var _line = mutableProvider(0)
55+
56+
override val content: ProviderDslProperty<List<C>>
57+
get() = ProviderDslProperty(::_content)
58+
override val line: MutableProviderDslProperty<Int>
59+
get() = MutableProviderDslProperty(::_line)
5560
override val lineCount = internalLineCount.flatten()
5661
override val maxLine = internalMaxLine.flatten()
5762

5863
override fun applyToBuilder(builder: ScrollGui.Builder<C>) {
5964
super.applyToBuilder(builder)
6065
builder.apply {
61-
setContent(content.delegate)
62-
setLine(line.delegate)
66+
setContent(_content)
67+
setLine(_line)
6368

6469
addModifier { gui ->
6570
internalLineCount.set(gui.lineCountProvider)

0 commit comments

Comments
 (0)