Poke_Transporter_GB/source/select_menu.cpp
Philippe Symons 1d57c10333 Replace text_data_table with FileContainerReader
text_data_table was very similar in concept to FileContainerReader.

But FileContainerReader is generally more flexible, as it allows you to split up your table into several chunks.
This takes away the worry of these files getting too big to compress.

However, we now have a maintenance duty for the text_tables file, which maps a table index to the list of chunks.

We also need to be careful about every use of FileContainerReader::getPointerToFileInDecompressionBuffer().

Using it is fine when you're dealing with a single chunk or if you're sure the file doesn't span multiple chunks.
But the moment you seek to a different chunk, any pointer obtained from getPointerToFileInDecompressionBuffer()
becomes stale as the decompression buffer gets overwritten.

Still, this function is necessary for high memory pressure situations, such as mystery_gift_builder, because we can't maintain
multiple lineBuffers there.
2026-05-20 13:31:28 +02:00

137 lines
3.7 KiB
C++

#include "select_menu.h"
#include "sprite_data.h"
#include "translated_text.h"
#include "global_frame_controller.h"
#define TEXT_HEIGHT 10
#define TEXT_WIDTH 8
#define TILE_HEIGHT 8
#define TILE_WIDTH 8
Select_Menu::Select_Menu(bool enable_cancel, u8 nMenu_type, unsigned nStartTileX, unsigned nStartTileY)
: vertical_menu_cursor_handler(TEXT_WIDTH, 3)
, menu_widget_(vertical_menu_settings{
.x = static_cast<unsigned>(nStartTileX * TILE_WIDTH),
.y = static_cast<unsigned>(nStartTileY * TILE_HEIGHT),
.width = 10 * TEXT_WIDTH,
.height = TILE_HEIGHT * 2, // to account for the margins
.margin_top = TILE_HEIGHT,
.margin_bottom = TILE_HEIGHT,
.initial_focus_index = 0,
.item_height = TEXT_HEIGHT,
.text_table_index = GENERAL_INDEX,
.allow_cancel = enable_cancel,
.should_delete_item_widgets_on_destruct = true,
.should_hide_state_changed_handler_on_not_focused = false
})
, menu_type(nMenu_type)
, lang(0)
{
menu_widget_.set_state_changed_handler(this);
menu_widget_.set_run_cycle_handler(this);
}
void Select_Menu::add_option(const u8 option, u8 return_value)
{
const simple_item_widget_data item_data = {
.text = {
.text_table_index = option,
.margin_left = 2 * TILE_WIDTH,
.margin_top = 0
},
.value = return_value,
.on_execute_callback = nullptr
};
menu_widget_.add_item_widget(new simple_item_renderer(item_data));
vertical_menu_settings settings = menu_widget_.get_settings();
settings.height += TEXT_HEIGHT + (item_data.text.margin_top * 2);
menu_widget_.set_settings(settings);
}
void Select_Menu::clear_options()
{
menu_widget_.clear_item_widgets();
vertical_menu_settings settings = menu_widget_.get_settings();
settings.height = TILE_HEIGHT * 2; // reset to just the margins
menu_widget_.set_settings(settings);
}
int Select_Menu::select_menu_main()
{
unsigned choice_index;
unsigned item_value;
simple_item_renderer* widget = nullptr;
menu_widget_.show();
choice_index = menu_widget_.run();
if(choice_index != UINT32_MAX)
{
widget = static_cast<simple_item_renderer*>(menu_widget_.get_item_widget_at(choice_index));
}
item_value = (widget) ? widget->get_data().value : UINT8_MAX;
menu_widget_.hide();
//global_next_frame();
return item_value;
}
void Select_Menu::set_lang(u8 nLang)
{
lang = nLang;
}
void Select_Menu::on_hide()
{
// call the base implementation to hide the cursor
vertical_menu_cursor_handler::on_hide();
obj_hide(cart_shell);
obj_hide(cart_label);
obj_hide(flag);
}
void Select_Menu::on_selection_changed(unsigned new_index, unsigned x, unsigned y)
{
// call the base implementation to move the cursor
vertical_menu_cursor_handler::on_selection_changed(new_index, x, y);
simple_item_renderer* widget = static_cast<simple_item_renderer*>(menu_widget_.get_item_widget_at(new_index));
const unsigned item_value = (widget) ? widget->get_data().value : UINT8_MAX;
if (item_value == UINT8_MAX)
{
switch (menu_type)
{
case CART_MENU:
obj_hide(cart_shell);
obj_hide(cart_label);
break;
case LANG_MENU:
obj_hide(flag);
break;
}
}
else
{
switch (menu_type)
{
case CART_MENU:
load_select_sprites(item_value, lang);
obj_unhide(cart_shell, 0);
obj_unhide(cart_label, 0);
break;
case LANG_MENU:
load_select_sprites(0, item_value);
obj_unhide(flag, 0);
break;
}
}
}
void Select_Menu::on_run_cycle()
{
update_y_offset();
}