From bb349827b7a5ea5fb97a4e33e7a979c38377efa2 Mon Sep 17 00:00:00 2001 From: Danielle Voznyy Date: Mon, 19 Aug 2024 20:45:22 -0400 Subject: [PATCH] fix: Correctly calculate size when using Modifier.size on Paginated and Scrollable composables --- .../com/mineinabyss/guiy/example/gui/PaginatedMenu.kt | 3 ++- .../com/mineinabyss/guiy/example/gui/ScrollingMenu.kt | 4 ++-- .../com/mineinabyss/guiy/components/lists/Paginated.kt | 7 ++++++- .../com/mineinabyss/guiy/components/lists/Scrollable.kt | 9 +++++++-- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/guiy-example/src/main/kotlin/com/mineinabyss/guiy/example/gui/PaginatedMenu.kt b/guiy-example/src/main/kotlin/com/mineinabyss/guiy/example/gui/PaginatedMenu.kt index 09162d7..2bf7076 100644 --- a/guiy-example/src/main/kotlin/com/mineinabyss/guiy/example/gui/PaginatedMenu.kt +++ b/guiy-example/src/main/kotlin/com/mineinabyss/guiy/example/gui/PaginatedMenu.kt @@ -10,6 +10,7 @@ import com.mineinabyss.guiy.inventory.LocalGuiyOwner import com.mineinabyss.guiy.modifiers.Modifier import com.mineinabyss.guiy.modifiers.click.clickable import com.mineinabyss.guiy.modifiers.fillMaxSize +import com.mineinabyss.guiy.modifiers.size import org.bukkit.Material import org.bukkit.entity.Player import org.bukkit.inventory.ItemStack @@ -35,7 +36,7 @@ fun PaginatedMenu(player: Player) { previousButton = { Item(Material.RED_CONCRETE, "Previous", modifier = Modifier.clickable { page-- }) }, nextButton = { Item(Material.BLUE_CONCRETE, "Next", modifier = Modifier.clickable { page++ }) }, ) { pageItems -> - HorizontalGrid { + HorizontalGrid(Modifier.size(4, 5)) { pageItems.forEach { item -> Item(item) } diff --git a/guiy-example/src/main/kotlin/com/mineinabyss/guiy/example/gui/ScrollingMenu.kt b/guiy-example/src/main/kotlin/com/mineinabyss/guiy/example/gui/ScrollingMenu.kt index f98d44a..9c2be3c 100644 --- a/guiy-example/src/main/kotlin/com/mineinabyss/guiy/example/gui/ScrollingMenu.kt +++ b/guiy-example/src/main/kotlin/com/mineinabyss/guiy/example/gui/ScrollingMenu.kt @@ -20,7 +20,7 @@ fun ScrollingMenu(player: Player) { val owner = LocalGuiyOwner.current Chest( setOf(player), - "Pagination example", + "Scrolling example", onClose = { owner.exit() }, modifier = Modifier.fillMaxSize() ) { @@ -37,7 +37,7 @@ fun ScrollingMenu(player: Player) { previousButton = { Item(Material.RED_CONCRETE, "Previous", modifier = Modifier.clickable { line-- }) }, nextButton = { Item(Material.BLUE_CONCRETE, "Next", modifier = Modifier.clickable { line++ }) }, ) { pageItems -> - VerticalGrid { + VerticalGrid(Modifier.fillMaxSize()) { pageItems.forEach { item -> Item(item) } diff --git a/src/main/kotlin/com/mineinabyss/guiy/components/lists/Paginated.kt b/src/main/kotlin/com/mineinabyss/guiy/components/lists/Paginated.kt index 0c29276..649320d 100644 --- a/src/main/kotlin/com/mineinabyss/guiy/components/lists/Paginated.kt +++ b/src/main/kotlin/com/mineinabyss/guiy/components/lists/Paginated.kt @@ -15,6 +15,11 @@ import com.mineinabyss.idofront.items.editItemMeta import org.bukkit.Material import org.bukkit.inventory.ItemStack +/** + * A paginated list of items, with buttons to go to the next and previous pages. + * + * Content must set a size or fillMaxSize Modifier to be visible. + */ @Composable fun Paginated( items: List, @@ -49,7 +54,7 @@ fun Paginated( } }, content = { - Box(Modifier.fillMaxSize().onSizeChanged { + Box(Modifier.onSizeChanged { size = it }) { content(pageItems) diff --git a/src/main/kotlin/com/mineinabyss/guiy/components/lists/Scrollable.kt b/src/main/kotlin/com/mineinabyss/guiy/components/lists/Scrollable.kt index 1bf097b..9070711 100644 --- a/src/main/kotlin/com/mineinabyss/guiy/components/lists/Scrollable.kt +++ b/src/main/kotlin/com/mineinabyss/guiy/components/lists/Scrollable.kt @@ -15,6 +15,11 @@ enum class ScrollDirection { VERTICAL, HORIZONTAL; } +/** + * A scrollable list of items, with buttons to go to the next and previous lines. + * + * Content must set a size or fillMaxSize Modifier to be visible. + */ @Composable fun Scrollable( items: List, @@ -35,7 +40,7 @@ fun Scrollable( val totalLines = if (scrollDirection == ScrollDirection.VERTICAL) size.height else size.width Box(Modifier.fillMaxSize()) { val start = line * itemsPerLine - val end = (line + 1) * itemsPerLine * totalLines + val end = start + (itemsPerLine * totalLines) val pageItems = remember(start, end) { if (start < 0) emptyList() else items.subList(start, end.coerceAtMost(items.size)) @@ -51,7 +56,7 @@ fun Scrollable( } }, content = { - Box(Modifier.fillMaxSize().onSizeChanged { + Box(Modifier.onSizeChanged { size = it }) { content(pageItems)