summaryrefslogtreecommitdiff
path: root/include/list_menu.h
blob: a02e12733d3e4ae605b86e9815921cfe6c5c5697 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#ifndef POKEDIAMOND_LIST_MENU_H
#define POKEDIAMOND_LIST_MENU_H

#include "list_menu_cursor.h"
#include "list_menu_items.h"

#define LIST_HEADER          -3
#define LIST_CANCEL          -2
#define LIST_NOTHING_CHOSEN  -1

#define LIST_NO_MULTIPLE_SCROLL    0
#define LIST_MULTIPLE_SCROLL_DPAD  1
#define LIST_MULTIPLE_SCROLL_L_R   2

struct ListMenu;

// TODO: Document remaining fields.
// A lot of these are named based on similar fields in gen 3.

typedef void (*LM_MoveCursorFunc_t)(struct ListMenu *list, s32 index, u8 onInit);
typedef void (*LM_ItemPrintFunc_t)(struct ListMenu *list, s32 index, u8 y);

struct ListMenuTemplate
{
    /*0x00*/ struct ListMenuItem * items;
    /*0x04*/ LM_MoveCursorFunc_t moveCursorFunc;
    /*0x08*/ LM_ItemPrintFunc_t itemPrintFunc;
    /*0x0C*/ struct Window * window;
    /*0x10*/ u16 totalItems;
    /*0x12*/ u16 maxShowed;
    /*0x14*/ u8 header_X;
    /*0x15*/ u8 item_X;
    /*0x16*/ u8 cursor_X;
    /*0x17*/ u8 upText_Y:4;
             u8 cursorPal:4;
    /*0x18*/ u8 fillValue:4;
             u8 cursorShadowPal:4;
    /*0x1A*/ u16 lettersSpacing:3;
             u16 itemVerticalPadding:4;
             u16 scrollMultiple:2;
             u16 fontId:6;
             u16 cursorKind:1;
    /*0x1C*/ u32 unk_1C;
};

struct ListMenu
{
    /*0x00*/ struct ListMenuTemplate template;
    // ListMenuOverride from gen 3
    /*0x20*/ u8 cursorPal:4;
             u8 fillValue:4;
    /*0x21*/ u8 cursorShadowPal:4;
             u8 unk_21_4:4;
    /*0x22*/ u8 lettersSpacing:6;
    /*0x23*/ u8 unk_23;
    /*0x24*/ u8 fontId:7;
             u8 overrideEnabled:1;
    /*0x28*/ struct ListMenuCursor *cursor;
    /*0x2c*/ u16 cursorPos;
    /*0x2e*/ u16 itemsAbove;
    /*0x30*/ u8 unk_30;
    /*0x31*/ u8 unk_31;
    /*0x32*/ u8 taskId;
    /*0x33*/ u8 unk_33;
    /*0x34*/ u8 heap_id;
};

struct ListMenu * ListMenuInit(const struct ListMenuTemplate * template, u16 cursorPos, u16 itemsAbove, u32 heap_id);
s32 ListMenu_ProcessInput(struct ListMenu * list);
void DestroyListMenu(struct ListMenu * list, u16 * cursorPos, u16 * itemsAbove);
void RedrawListMenu(struct ListMenu * list);
s32 ListMenuTestInputInternal(struct ListMenu * list, const struct ListMenuTemplate * template, u16 cursorPos, u16 itemsAbove, u16 updateFlag, u16 input, u16 *newCursorPos, u16 *newItemsAbove);
s32 ListMenuTestInput(struct ListMenu * list, const struct ListMenuTemplate * template, u16 cursorPos, u16 itemsAbove, u16 input, u16 *newCursorPos, u16 *newItemsAbove);
void ListMenuOverrideSetColors(struct ListMenu * list, u8 cursorPal, u8 fillValue, u8 cursorShadowPal);
void ListMenuGetCurrentItemArrayId(struct ListMenu * list, u16 * index_p);
void ListMenuGetScrollAndRow(struct ListMenu * list, u16 * cursorPos_p, u16 * itemsAbove_p);
u8 ListMenuGetUnk33(struct ListMenu * list);
s32 ListMenuGetValueByArrayId(struct ListMenu * list, s32 index);
s32 ListMenuGetTemplateField(struct ListMenu * list, u32 attr);
void ListMenuSetTemplateField(struct ListMenu * list, u32 attr, s32 value);
void ListMenuGetItemStr(struct ListMenu * list, struct ListMenuItem * items);
void ListMenuPrint(struct ListMenu * list, struct String * str, u8 x, u8 y);
void ListMenuErasePrintedCursor(struct ListMenu * list, u16 itemsAbove);
u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, u8 movingDown);
void ListMenuScroll(struct ListMenu * list, u8 count, u8 movingDown);
void ListMenuCopyToVram(struct ListMenu * list);

#endif // POKEDIAMOND_LIST_MENU_H