From bf19e3514aab78a5b3ee6d38081cb61652ed4d66 Mon Sep 17 00:00:00 2001 From: Ammo Date: Mon, 22 Sep 2025 17:57:55 +0200 Subject: [PATCH 1/5] feat: implement paginated dialog builder with navigation buttons --- .idea/misc.xml | 2 +- .idea/modules.xml | 3 - gradle.properties | 2 +- .../api/surf-api-bukkit-api.api | 34 +++ .../dialog/builder/DialogPaginationBuilder.kt | 248 ++++++++++++++++++ 5 files changed, 284 insertions(+), 5 deletions(-) create mode 100644 surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt diff --git a/.idea/misc.xml b/.idea/misc.xml index ed2437ab..bdec65e5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -19,7 +19,7 @@ - + diff --git a/.idea/modules.xml b/.idea/modules.xml index bb04ac9d..b0a65603 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -7,11 +7,8 @@ - - - diff --git a/gradle.properties b/gradle.properties index b622645e..2a7f8df9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,6 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled javaVersion=21 mcVersion=1.21.8 group=dev.slne.surf -version=1.21.8-2.38.0 +version=1.21.8-2.39.0 relocationPrefix=dev.slne.surf.surfapi.libs snapshot=true \ No newline at end of file diff --git a/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api b/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api index a136485f..25b07d12 100644 --- a/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api +++ b/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api @@ -1272,6 +1272,40 @@ public final class dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogInputBu public static final fun dialogInput (Lkotlin/jvm/functions/Function1;)Lit/unimi/dsi/fastutil/objects/ObjectList; } +public abstract interface class dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction { + public abstract fun newPage (II)I +} + +public final class dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder { + public fun ()V + public final fun addElement (Ljava/lang/Object;)V + public final fun addElements (Ljava/util/Collection;)V + public final fun addElements ([Ljava/lang/Object;)V + public final fun backButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V + public static synthetic fun backButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V + public final fun base (Lkotlin/jvm/functions/Function3;)V + public final fun build ()Lio/papermc/paper/dialog/Dialog; + public final fun buttonBuilder (Lkotlin/jvm/functions/Function1;)V + public final fun currentPageButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V + public static synthetic fun currentPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V + public final fun elementsPerPage (I)V + public final fun exitAction (Lkotlin/jvm/functions/Function1;)V + public final fun firstPageButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V + public static synthetic fun firstPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V + public final fun getCurrentPage ()I + public final fun getMaxPages ()I + public final fun lastPageButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V + public static synthetic fun lastPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V + public final fun nextButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V + public static synthetic fun nextButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V + public final fun paginationButtonWidth (I)V +} + +public final class dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilderKt { + public static final fun PaginatedDialog (Lkotlin/jvm/functions/Function1;)Lio/papermc/paper/dialog/Dialog; + public static final fun paginatedDialog (Lkotlin/jvm/functions/Function1;)Lio/papermc/paper/dialog/Dialog; +} + public final class dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogTypeBuilder { public fun ()V public final fun confirmation (Lio/papermc/paper/registry/data/dialog/ActionButton;Lio/papermc/paper/registry/data/dialog/ActionButton;)V diff --git a/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt b/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt new file mode 100644 index 00000000..da384930 --- /dev/null +++ b/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt @@ -0,0 +1,248 @@ +@file:Suppress("UnstableApiUsage") + +package dev.slne.surf.surfapi.bukkit.api.dialog.builder + +import dev.slne.surf.surfapi.bukkit.api.dialog.base +import dev.slne.surf.surfapi.bukkit.api.dialog.dialog +import dev.slne.surf.surfapi.bukkit.api.dialog.type +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText +import dev.slne.surf.surfapi.core.api.messages.adventure.text +import io.papermc.paper.registry.data.dialog.ActionButton +import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet +import net.kyori.adventure.text.Component + +private const val PAGINATION_BUTTON_DEFAULT_WIDTH = 50 + +fun PaginatedDialog( + block: DialogPaginationBuilder.() -> Unit, +) = DialogPaginationBuilder().apply(block).build() + +fun paginatedDialog( + block: DialogPaginationBuilder.() -> Unit, +) = PaginatedDialog(block) + +fun interface DialogPageAction { + fun newPage(currentPage: Int, maxPages: Int): Int +} + +private enum class DialogPaginationBaseAction( + val label: (Int, Int) -> Component, + val tooltip: (Int, Int) -> Component, + val pageAction: DialogPageAction, +) { + FIRST( + label = { _, _ -> text("«") }, + tooltip = { _, _ -> buildText { info("Erste Seite") } }, + pageAction = { _, _ -> 0 } + ), + BACK( + label = { _, _ -> text("‹") }, + tooltip = { _, _ -> buildText { info("Vorherige Seite") } }, + pageAction = { currentPage, _ -> (currentPage - 1).coerceAtLeast(0) } + ), + CURRENT( + label = { currentPage, maxPages -> text("${currentPage + 1} / $maxPages") }, + tooltip = { currentPage, maxPages -> buildText { info("Seite ${currentPage + 1} von $maxPages") } }, + pageAction = { currentPage, _ -> currentPage }, + ), + NEXT( + label = { _, _ -> text("›") }, + tooltip = { _, _ -> buildText { info("Nächste Seite") } }, + pageAction = { currentPage, maxPages -> (currentPage + 1).coerceAtMost(maxPages - 1) } + ), + LAST( + label = { _, _ -> text("»") }, + tooltip = { _, _ -> buildText { info("Letzte Seite") } }, + pageAction = { _, maxPages -> maxPages - 1 } + ); + + fun actionButton( + currentPage: Int, + maxPages: Int, + width: Int, + ) = actionButton { + label(this@DialogPaginationBaseAction.label(currentPage, maxPages)) + tooltip(this@DialogPaginationBaseAction.tooltip(currentPage, maxPages)) + width(width) + } +} + +class DialogPaginationBuilder { + + private var base: (DialogBaseBuilder.() -> Unit)? = null + private var exitAction: ActionButton? = null + private var buttonBuilder: ((T) -> ActionButton)? = null + + private val elements = ObjectLinkedOpenHashSet() + private var elementsPerPage = 10 + private val currentPageElements + get() = elements.drop(currentPage * elementsPerPage).take(elementsPerPage) + + private var paginationButtonWidth = PAGINATION_BUTTON_DEFAULT_WIDTH + + var currentPage = 0 + private set + + val maxPages: Int + get() = (elements.size + elementsPerPage - 1) / elementsPerPage + + private var firstPageButton = DialogPaginationBaseAction.FIRST.actionButton( + currentPage, maxPages, paginationButtonWidth + ) + + private var backButton = DialogPaginationBaseAction.BACK.actionButton( + currentPage, maxPages, paginationButtonWidth + ) + + private var currentPageButton = DialogPaginationBaseAction.CURRENT.actionButton( + currentPage, maxPages, paginationButtonWidth + ) + + private var nextButton = DialogPaginationBaseAction.NEXT.actionButton( + currentPage, maxPages, paginationButtonWidth + ) + + private var lastPageButton = DialogPaginationBaseAction.LAST.actionButton( + currentPage, maxPages, paginationButtonWidth + ) + + fun base(block: DialogBaseBuilder.(Int, Int) -> Unit) { + base = { + block(currentPage, maxPages) + } + } + + private fun buildPageButtonAction(pageAction: DialogPageAction) = dialogAction { + playerCallback { player -> + val newPage = pageAction.newPage(currentPage, maxPages) + + if (newPage == currentPage) return@playerCallback + + player.showDialog(this@DialogPaginationBuilder.build()) + } + } + + fun firstPageButton( + block: DialogActionButtonBuilder.(Int, Int) -> Unit, + pageAction: DialogPageAction = DialogPaginationBaseAction.FIRST.pageAction, + ) { + firstPageButton = actionButton { + block(currentPage, maxPages) + + action(buildPageButtonAction(pageAction)) + } + } + + fun backButton( + block: DialogActionButtonBuilder.(Int, Int) -> Unit, + pageAction: DialogPageAction = DialogPaginationBaseAction.BACK.pageAction, + ) { + backButton = actionButton { + block(currentPage, maxPages) + + action(buildPageButtonAction(pageAction)) + } + } + + fun currentPageButton( + block: DialogActionButtonBuilder.(Int, Int) -> Unit, + pageAction: DialogPageAction = DialogPaginationBaseAction.CURRENT.pageAction, + ) { + currentPageButton = actionButton { + block(currentPage, maxPages) + + action(buildPageButtonAction(pageAction)) + } + } + + fun nextButton( + block: DialogActionButtonBuilder.(Int, Int) -> Unit, + pageAction: DialogPageAction = DialogPaginationBaseAction.NEXT.pageAction, + ) { + nextButton = actionButton { + block(currentPage, maxPages) + + action(buildPageButtonAction(pageAction)) + } + } + + fun lastPageButton( + block: DialogActionButtonBuilder.(Int, Int) -> Unit, + pageAction: DialogPageAction = DialogPaginationBaseAction.LAST.pageAction, + ) { + lastPageButton = actionButton { + block(currentPage, maxPages) + + action(buildPageButtonAction(pageAction)) + } + } + + fun elementsPerPage(elementsPerPage: Int) { + require(elementsPerPage > 0) { "elementsPerPage must be greater than 0" } + + this.elementsPerPage = elementsPerPage + } + + fun addElement(element: T) { + elements.add(element) + } + + fun addElements(elements: Collection) { + this.elements.addAll(elements) + } + + fun addElements(vararg elements: T) { + this.elements.addAll(elements) + } + + fun paginationButtonWidth(width: Int) { + require(width in 1..1024) { + "Pagination button width must be between 1 and 100" + } + + paginationButtonWidth = width + } + + fun exitAction(block: DialogActionButtonBuilder.() -> Unit) { + exitAction = actionButton(block) + } + + fun buttonBuilder(builder: (T) -> ActionButton) { + buttonBuilder = builder + } + + fun build() = dialog { + val baseBuilder = base + val buttonBuilder = buttonBuilder + val exitAction = exitAction + + require(baseBuilder != null) { + "Dialog base must be set before building the paginated dialog" + } + + require(buttonBuilder != null) { + "Dialog button builder must be set before building the paginated dialog" + } + + base(baseBuilder) + + val elementButtons = currentPageElements.map { buttonBuilder(it) } + + type { + multiAction { + elementButtons.forEach { action(it) } + + action(firstPageButton) + action(backButton) + action(currentPageButton) + action(nextButton) + action(lastPageButton) + + if (exitAction != null) { + exitAction(exitAction) + } + } + } + } + +} \ No newline at end of file From 917e75b07171b9b0ed4ad316835c59f226d5eda5 Mon Sep 17 00:00:00 2001 From: Ammo Date: Mon, 22 Sep 2025 18:10:20 +0200 Subject: [PATCH 2/5] feat: enhance DialogPaginationBuilder with dynamic button width and pagination controls --- .../api/surf-api-bukkit-api.api | 5 +- .../dialog/builder/DialogPaginationBuilder.kt | 67 +++++++++++++++++-- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api b/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api index 25b07d12..0a77860a 100644 --- a/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api +++ b/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api @@ -1285,7 +1285,7 @@ public final class dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginat public static synthetic fun backButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V public final fun base (Lkotlin/jvm/functions/Function3;)V public final fun build ()Lio/papermc/paper/dialog/Dialog; - public final fun buttonBuilder (Lkotlin/jvm/functions/Function1;)V + public final fun buttonBuilder (Lkotlin/jvm/functions/Function2;)V public final fun currentPageButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V public static synthetic fun currentPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V public final fun elementsPerPage (I)V @@ -1293,9 +1293,12 @@ public final class dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginat public final fun firstPageButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V public static synthetic fun firstPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V public final fun getCurrentPage ()I + public final fun getHasNextPage ()Z + public final fun getHasPreviousPage ()Z public final fun getMaxPages ()I public final fun lastPageButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V public static synthetic fun lastPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V + public final fun minElementButtonWidth (I)V public final fun nextButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V public static synthetic fun nextButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V public final fun paginationButtonWidth (I)V diff --git a/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt b/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt index da384930..f212e7eb 100644 --- a/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt +++ b/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt @@ -71,7 +71,7 @@ class DialogPaginationBuilder { private var base: (DialogBaseBuilder.() -> Unit)? = null private var exitAction: ActionButton? = null - private var buttonBuilder: ((T) -> ActionButton)? = null + private var buttonBuilder: (DialogActionButtonBuilder.(T) -> Unit)? = null private val elements = ObjectLinkedOpenHashSet() private var elementsPerPage = 10 @@ -80,12 +80,37 @@ class DialogPaginationBuilder { private var paginationButtonWidth = PAGINATION_BUTTON_DEFAULT_WIDTH + @Suppress("SuspiciousVarProperty") + private var minElementButtonWidth = 200 + + private fun calculateElementButtonWidth(): Int { + var width = 0 + + if (hasPreviousPage) { + width += paginationButtonWidth * 2 // first + back + } + + if (hasNextPage) { + width += paginationButtonWidth * 2 // next + last + } + + width += paginationButtonWidth // current page button + + return width.coerceAtLeast(minElementButtonWidth) + } + var currentPage = 0 private set val maxPages: Int get() = (elements.size + elementsPerPage - 1) / elementsPerPage + val hasNextPage: Boolean + get() = currentPage < maxPages - 1 + + val hasPreviousPage: Boolean + get() = currentPage > 0 + private var firstPageButton = DialogPaginationBaseAction.FIRST.actionButton( currentPage, maxPages, paginationButtonWidth ) @@ -129,6 +154,7 @@ class DialogPaginationBuilder { firstPageButton = actionButton { block(currentPage, maxPages) + width(paginationButtonWidth) action(buildPageButtonAction(pageAction)) } } @@ -140,6 +166,7 @@ class DialogPaginationBuilder { backButton = actionButton { block(currentPage, maxPages) + width(paginationButtonWidth) action(buildPageButtonAction(pageAction)) } } @@ -151,6 +178,7 @@ class DialogPaginationBuilder { currentPageButton = actionButton { block(currentPage, maxPages) + width(paginationButtonWidth) action(buildPageButtonAction(pageAction)) } } @@ -162,6 +190,7 @@ class DialogPaginationBuilder { nextButton = actionButton { block(currentPage, maxPages) + width(paginationButtonWidth) action(buildPageButtonAction(pageAction)) } } @@ -173,6 +202,7 @@ class DialogPaginationBuilder { lastPageButton = actionButton { block(currentPage, maxPages) + width(paginationButtonWidth) action(buildPageButtonAction(pageAction)) } } @@ -203,11 +233,19 @@ class DialogPaginationBuilder { paginationButtonWidth = width } + fun minElementButtonWidth(width: Int) { + require(width in 1..1024) { + "Element button minimum width must be between 1 and 1024" + } + + minElementButtonWidth = width + } + fun exitAction(block: DialogActionButtonBuilder.() -> Unit) { exitAction = actionButton(block) } - fun buttonBuilder(builder: (T) -> ActionButton) { + fun buttonBuilder(builder: DialogActionButtonBuilder.(T) -> Unit) { buttonBuilder = builder } @@ -226,17 +264,32 @@ class DialogPaginationBuilder { base(baseBuilder) - val elementButtons = currentPageElements.map { buttonBuilder(it) } + val elementButtonWidth = calculateElementButtonWidth() + val elementButtons = currentPageElements.map { + actionButton { + buttonBuilder(it) + + width(elementButtonWidth) + } + } type { multiAction { + columns(1) + elementButtons.forEach { action(it) } - action(firstPageButton) - action(backButton) + if (hasPreviousPage) { + action(firstPageButton) + action(backButton) + } + action(currentPageButton) - action(nextButton) - action(lastPageButton) + + if (hasNextPage) { + action(nextButton) + action(lastPageButton) + } if (exitAction != null) { exitAction(exitAction) From 9235c4d766db0f5bbc030eeb90db1d8a6900d51e Mon Sep 17 00:00:00 2001 From: Ammo Date: Mon, 22 Sep 2025 18:15:28 +0200 Subject: [PATCH 3/5] feat: rename pagination button methods for clarity and consistency --- .../api/surf-api-bukkit-api.api | 20 +++++++++---------- .../dialog/builder/DialogPaginationBuilder.kt | 16 +++++++-------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api b/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api index 0a77860a..6b5ba226 100644 --- a/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api +++ b/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api @@ -1281,27 +1281,27 @@ public final class dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginat public final fun addElement (Ljava/lang/Object;)V public final fun addElements (Ljava/util/Collection;)V public final fun addElements ([Ljava/lang/Object;)V - public final fun backButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V - public static synthetic fun backButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V public final fun base (Lkotlin/jvm/functions/Function3;)V public final fun build ()Lio/papermc/paper/dialog/Dialog; public final fun buttonBuilder (Lkotlin/jvm/functions/Function2;)V - public final fun currentPageButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V - public static synthetic fun currentPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V + public final fun currentPageButton (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;Lkotlin/jvm/functions/Function3;)V + public static synthetic fun currentPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)V public final fun elementsPerPage (I)V public final fun exitAction (Lkotlin/jvm/functions/Function1;)V - public final fun firstPageButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V - public static synthetic fun firstPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V + public final fun firstPageButton (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;Lkotlin/jvm/functions/Function3;)V + public static synthetic fun firstPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)V public final fun getCurrentPage ()I public final fun getHasNextPage ()Z public final fun getHasPreviousPage ()Z public final fun getMaxPages ()I - public final fun lastPageButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V - public static synthetic fun lastPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V + public final fun lastPageButton (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;Lkotlin/jvm/functions/Function3;)V + public static synthetic fun lastPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)V public final fun minElementButtonWidth (I)V - public final fun nextButton (Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;)V - public static synthetic fun nextButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Lkotlin/jvm/functions/Function3;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;ILjava/lang/Object;)V + public final fun nextPageButton (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;Lkotlin/jvm/functions/Function3;)V + public static synthetic fun nextPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)V public final fun paginationButtonWidth (I)V + public final fun previousPageButton (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;Lkotlin/jvm/functions/Function3;)V + public static synthetic fun previousPageButton$default (Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder;Ldev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPageAction;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)V } public final class dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilderKt { diff --git a/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt b/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt index f212e7eb..52218188 100644 --- a/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt +++ b/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt @@ -148,8 +148,8 @@ class DialogPaginationBuilder { } fun firstPageButton( - block: DialogActionButtonBuilder.(Int, Int) -> Unit, pageAction: DialogPageAction = DialogPaginationBaseAction.FIRST.pageAction, + block: DialogActionButtonBuilder.(Int, Int) -> Unit, ) { firstPageButton = actionButton { block(currentPage, maxPages) @@ -159,9 +159,9 @@ class DialogPaginationBuilder { } } - fun backButton( - block: DialogActionButtonBuilder.(Int, Int) -> Unit, + fun previousPageButton( pageAction: DialogPageAction = DialogPaginationBaseAction.BACK.pageAction, + block: DialogActionButtonBuilder.(Int, Int) -> Unit, ) { backButton = actionButton { block(currentPage, maxPages) @@ -172,8 +172,8 @@ class DialogPaginationBuilder { } fun currentPageButton( - block: DialogActionButtonBuilder.(Int, Int) -> Unit, pageAction: DialogPageAction = DialogPaginationBaseAction.CURRENT.pageAction, + block: DialogActionButtonBuilder.(Int, Int) -> Unit, ) { currentPageButton = actionButton { block(currentPage, maxPages) @@ -183,9 +183,9 @@ class DialogPaginationBuilder { } } - fun nextButton( - block: DialogActionButtonBuilder.(Int, Int) -> Unit, + fun nextPageButton( pageAction: DialogPageAction = DialogPaginationBaseAction.NEXT.pageAction, + block: DialogActionButtonBuilder.(Int, Int) -> Unit, ) { nextButton = actionButton { block(currentPage, maxPages) @@ -196,8 +196,8 @@ class DialogPaginationBuilder { } fun lastPageButton( - block: DialogActionButtonBuilder.(Int, Int) -> Unit, pageAction: DialogPageAction = DialogPaginationBaseAction.LAST.pageAction, + block: DialogActionButtonBuilder.(Int, Int) -> Unit, ) { lastPageButton = actionButton { block(currentPage, maxPages) @@ -276,7 +276,7 @@ class DialogPaginationBuilder { type { multiAction { columns(1) - + elementButtons.forEach { action(it) } if (hasPreviousPage) { From 7c5d9c13a3a6b02e0bcd156fbcec40bed6603a38 Mon Sep 17 00:00:00 2001 From: twisti <76837088+twisti-dev@users.noreply.github.com> Date: Mon, 22 Sep 2025 18:17:02 +0200 Subject: [PATCH 4/5] Update surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../bukkit/api/dialog/builder/DialogPaginationBuilder.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt b/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt index 52218188..3e5e23c3 100644 --- a/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt +++ b/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt @@ -227,7 +227,7 @@ class DialogPaginationBuilder { fun paginationButtonWidth(width: Int) { require(width in 1..1024) { - "Pagination button width must be between 1 and 100" + "Pagination button width must be between 1 and 1024" } paginationButtonWidth = width From d0258510cd44cd23f3f77cdc463a5f23f1966441 Mon Sep 17 00:00:00 2001 From: Ammo Date: Mon, 22 Sep 2025 18:18:18 +0200 Subject: [PATCH 5/5] feat: update currentPage state in DialogPaginationBuilder on page change --- .../bukkit/api/dialog/builder/DialogPaginationBuilder.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt b/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt index 52218188..9c0c375d 100644 --- a/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt +++ b/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/dialog/builder/DialogPaginationBuilder.kt @@ -143,6 +143,8 @@ class DialogPaginationBuilder { if (newPage == currentPage) return@playerCallback + currentPage = newPage + player.showDialog(this@DialogPaginationBuilder.build()) } }