summaryrefslogtreecommitdiff
path: root/arm9/src/list_menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/src/list_menu.c')
-rw-r--r--arm9/src/list_menu.c126
1 files changed, 126 insertions, 0 deletions
diff --git a/arm9/src/list_menu.c b/arm9/src/list_menu.c
new file mode 100644
index 00000000..6d440ad1
--- /dev/null
+++ b/arm9/src/list_menu.c
@@ -0,0 +1,126 @@
+#include "global.h"
+#include "heap.h"
+#include "main.h"
+#include "list_menu.h"
+
+extern void * FUN_02013690(u32 heap_id);
+extern void CreateListMenuCursorObj(void *, u32);
+extern void DestroyListMenuCursorObj(void *);
+extern void FillWindowPixelBuffer(struct Window *, u32);
+void ListMenuPrintEntries(struct ListMenu *, u16, u16, u16);
+void ListMenuDrawCursor(struct ListMenu *);
+BOOL ListMenuChangeSelection(struct ListMenu *, s32, u8, s32);
+void ListMenuCallSelectionChangedCallback(struct ListMenu *, BOOL);
+extern void CopyWindowToVram(struct Window *);
+
+THUMB_FUNC struct ListMenu * ListMenuInit(const struct ListMenuTemplate * template, u16 cursorPos, u16 itemsAbove, u32 heap_id)
+{
+ struct ListMenu * list = AllocFromHeap(heap_id, sizeof(struct ListMenu));
+ list->template = *template;
+ list->cursor = FUN_02013690(heap_id);
+ list->cursorPos = cursorPos;
+ list->itemsAbove = itemsAbove;
+ list->unk_30 = 0;
+ list->unk_31 = 0;
+ list->taskId = 0xFF;
+ list->unk_33 = 0;
+ list->heap_id = (u8)heap_id;
+ list->cursorPal = list->template.cursorPal;
+ list->fillValue = list->template.fillValue;
+ list->cursorShadowPal = list->template.cursorShadowPal;
+ list->lettersSpacing = list->template.lettersSpacing;
+ list->fontId = list->template.fontId;
+ list->enabled = 0;
+ if (list->template.totalItems < list->template.maxShowed)
+ list->template.maxShowed = list->template.totalItems;
+ CreateListMenuCursorObj(
+ list->cursor,
+ (u32)(
+ ((u32)(list->template.cursorPal << 24) >> 8)
+ | ((u32)(list->template.cursorShadowPal << 24) >> 16)
+ | ((u32)(list->template.fillValue << 24) >> 24)
+ )
+ );
+ FillWindowPixelBuffer(list->template.window, list->template.fillValue);
+ ListMenuPrintEntries(list, list->cursorPos, 0, list->template.maxShowed);
+ ListMenuDrawCursor(list);
+ ListMenuCallSelectionChangedCallback(list, TRUE);
+ CopyWindowToVram(template->window);
+ return list;
+}
+
+THUMB_FUNC s32 ListMenu_ProcessInput(struct ListMenu * list)
+{
+ list->unk_33 = 0;
+
+ if (gMain.newKeys & REG_PAD_KEYINPUT_A_MASK) {
+ return list->template.items[list->cursorPos + list->itemsAbove].index;
+ }
+ else if (gMain.newKeys & REG_PAD_KEYINPUT_B_MASK) {
+ return LIST_CANCEL;
+ }
+ else if (gMain.newAndRepeatedKeys & REG_PAD_KEYINPUT_UP_MASK) {
+ if (!ListMenuChangeSelection(list, TRUE, 1, FALSE))
+ list->unk_33 = 1;
+ return LIST_NOTHING_CHOSEN;
+ }
+ else if (gMain.newAndRepeatedKeys & REG_PAD_KEYINPUT_DOWN_MASK) {
+ if (!ListMenuChangeSelection(list, TRUE, 1, TRUE))
+ list->unk_33 = 2;
+ return LIST_NOTHING_CHOSEN;
+ }
+ else
+ {
+ u16 rightButton, leftButton;
+ switch (list->template.scrollMultiple)
+ {
+ case LIST_NO_MULTIPLE_SCROLL:
+ default:
+ leftButton = FALSE;
+ rightButton = FALSE;
+ break;
+ case LIST_MULTIPLE_SCROLL_DPAD:
+ leftButton = gMain.newAndRepeatedKeys & REG_PAD_KEYINPUT_LEFT_MASK;
+ rightButton = gMain.newAndRepeatedKeys & REG_PAD_KEYINPUT_RIGHT_MASK;
+ break;
+ case LIST_MULTIPLE_SCROLL_L_R:
+ leftButton = gMain.newAndRepeatedKeys & REG_PAD_KEYINPUT_L_MASK;
+ rightButton = gMain.newAndRepeatedKeys & REG_PAD_KEYINPUT_R_MASK;
+ break;
+ }
+ if (leftButton)
+ {
+ if (!ListMenuChangeSelection(list, TRUE, list->template.maxShowed, FALSE))
+ list->unk_33 = 3;
+ return LIST_NOTHING_CHOSEN;
+ }
+ else if (rightButton)
+ {
+ if (!ListMenuChangeSelection(list, TRUE, list->template.maxShowed, TRUE))
+ list->unk_33 = 4;
+ return LIST_NOTHING_CHOSEN;
+ }
+ else
+ {
+ return LIST_NOTHING_CHOSEN;
+ }
+ }
+}
+
+THUMB_FUNC void DestroyListMenu(struct ListMenu * list, u16 * cursorPos, u16 * itemsAbove)
+{
+ if (cursorPos != NULL)
+ *cursorPos = list->cursorPos;
+ if (itemsAbove != NULL)
+ *itemsAbove = list->itemsAbove;
+ DestroyListMenuCursorObj(list->cursor);
+ FUN_02016A8C(list->heap_id, list);
+}
+
+THUMB_FUNC void RedrawListMenu(struct ListMenu * list)
+{
+ FillWindowPixelBuffer(list->template.window, list->template.fillValue);
+ ListMenuPrintEntries(list, list->cursorPos, 0, list->template.maxShowed);
+ ListMenuDrawCursor(list);
+ CopyWindowToVram(list->template.window);
+}