Skip to content

Commit

Permalink
scenes: Cleanup/refactor
Browse files Browse the repository at this point in the history
Now using the existing Flipper paradigm for specifying scenes
view macro hell. It will add some ballooned code since exit/event
scenes can no longer be generic/repeated, but should make overall
scene handling less convoluted and should be easier to approach
for new players.

Signed-off-by: Kris Bahnsen <[email protected]>
  • Loading branch information
kbembedded committed Aug 6, 2024
1 parent 717f383 commit 8a0c348
Show file tree
Hide file tree
Showing 34 changed files with 420 additions and 350 deletions.
6 changes: 4 additions & 2 deletions src/pokemon_app.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include <src/views/select_pokemon.h>
#include <src/include/pokemon_char_encode.h>

#include <src/scenes/pokemon_scene.h>

PokemonFap* pokemon_alloc() {
PokemonFap* pokemon_fap = (PokemonFap*)malloc(sizeof(PokemonFap));

Expand Down Expand Up @@ -40,10 +42,10 @@ PokemonFap* pokemon_alloc() {
pokemon_fap->dialog_ex = dialog_ex_alloc();

// Set up menu scene
pokemon_fap->scene_manager = scene_manager_alloc(&pokemon_scene_manager_handlers, pokemon_fap);
pokemon_fap->scene_manager = scene_manager_alloc(&pokemon_scene_handlers, pokemon_fap);
view_dispatcher_add_view(
pokemon_fap->view_dispatcher, AppViewMainMenu, submenu_get_view(pokemon_fap->submenu));
scene_manager_next_scene(pokemon_fap->scene_manager, MainMenuScene);
scene_manager_next_scene(pokemon_fap->scene_manager, PokemonSceneMainMenu);

return pokemon_fap;
}
Expand Down
25 changes: 17 additions & 8 deletions src/scenes/pokemon_exit_confirm.c
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
#include <gui/modules/dialog_ex.h>

#include <pokemon_icons.h>
#include <src/scenes/pokemon_menu.h>
#include <src/include/pokemon_app.h>
#include <src/include/pokemon_data.h>

#include <src/scenes/pokemon_scene.h>

#include <src/views/select_pokemon.h>
#include <src/views/trade.h>

static bool pokemon_exit_confirm_back_event_callback(void* context) {
static bool pokemon_scene_exit_confirm_back_event_callback(void* context) {
UNUSED(context);

return true;
}

void pokemon_exit_confirm_dialog_callback(DialogExResult result, void* context) {
static void pokemon_scene_exit_confirm_dialog_callback(DialogExResult result, void* context) {
PokemonFap* pokemon_fap = context;

scene_manager_handle_custom_event(pokemon_fap->scene_manager, result);
}

void pokemon_exit_confirm_on_enter(void* context) {
void pokemon_scene_exit_confirm_on_enter(void* context) {
PokemonFap* pokemon_fap = context;
DialogEx* dialog_ex = pokemon_fap->dialog_ex;

Expand All @@ -39,21 +40,21 @@ void pokemon_exit_confirm_on_enter(void* context) {
AlignTop);
dialog_ex_set_icon(dialog_ex, 44, 32, &I_surprised_pika);
dialog_ex_set_context(dialog_ex, pokemon_fap);
dialog_ex_set_result_callback(dialog_ex, pokemon_exit_confirm_dialog_callback);
dialog_ex_set_result_callback(dialog_ex, pokemon_scene_exit_confirm_dialog_callback);

/* Disable the existing navigation event handler to prevent handling further
* back events. Going back to the main menu as well as going back to the
* gen menu will re-enable the proper navigation handler.
*/
view_dispatcher_set_navigation_event_callback(
pokemon_fap->view_dispatcher, pokemon_exit_confirm_back_event_callback);
pokemon_fap->view_dispatcher, pokemon_scene_exit_confirm_back_event_callback);

view_dispatcher_add_view(
pokemon_fap->view_dispatcher, AppViewOpts, dialog_ex_get_view(pokemon_fap->dialog_ex));
view_dispatcher_switch_to_view(pokemon_fap->view_dispatcher, AppViewOpts);
}

bool pokemon_exit_confirm_on_event(void* context, SceneManagerEvent event) {
bool pokemon_scene_exit_confirm_on_event(void* context, SceneManagerEvent event) {
PokemonFap* pokemon_fap = context;
bool consumed = false;

Expand All @@ -62,7 +63,7 @@ bool pokemon_exit_confirm_on_event(void* context, SceneManagerEvent event) {
consumed = scene_manager_previous_scene(pokemon_fap->scene_manager);
} else if(event.event == DialogExResultLeft) {
consumed = scene_manager_search_and_switch_to_previous_scene(
pokemon_fap->scene_manager, MainMenuScene);
pokemon_fap->scene_manager, PokemonSceneMainMenu);
/* NOTE: The above should never fail */
furi_check(consumed);

Expand All @@ -88,3 +89,11 @@ bool pokemon_exit_confirm_on_event(void* context, SceneManagerEvent event) {

return consumed;
}

void pokemon_scene_exit_confirm_on_exit(void* context) {
PokemonFap* pokemon_fap = (PokemonFap*)context;

view_dispatcher_switch_to_view(pokemon_fap->view_dispatcher, AppViewMainMenu);
view_dispatcher_remove_view(pokemon_fap->view_dispatcher, AppViewOpts);
}

15 changes: 0 additions & 15 deletions src/scenes/pokemon_exit_confirm.h

This file was deleted.

79 changes: 45 additions & 34 deletions src/scenes/pokemon_gen.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
#include <src/views/trade.h>
#include <src/views/select_pokemon.h>

#include <src/scenes/pokemon_scene.h>

#include <src/scenes/pokemon_menu.h>
#include <src/scenes/pokemon_stats.h>
#include <src/scenes/pokemon_shiny.h>
#include <src/scenes/pokemon_gender.h>
#include <src/scenes/pokemon_pokerus.h>
Expand All @@ -19,16 +20,16 @@ static void scene_change_from_main_cb(void* context, uint32_t index) {

/* Reuse of scenes to allow for using the same functions to set names */
switch(index) {
case SelectNicknameScene:
case SelectOTNameScene:
case SelectUnownFormScene:
scene_manager_set_scene_state(pokemon_fap->scene_manager, SelectNicknameScene, index);
case PokemonSceneNickname:
case PokemonSceneOTName:
case PokemonSceneUnownForm:
scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneNickname, index);
break;
case SelectLevelScene:
case SelectOTIDScene:
scene_manager_set_scene_state(pokemon_fap->scene_manager, SelectLevelScene, index);
case PokemonSceneLevel:
case PokemonSceneOTID:
scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneLevel, index);
break;
case SelectGenderScene:
case PokemonSceneGender:
if(select_gender_is_static(
pokemon_fap->pdata,
table_stat_base_get(
Expand All @@ -50,19 +51,19 @@ static void scene_change_from_main_cb(void* context, uint32_t index) {
/* Set scene state to the current index so we can have that element highlighted when
* we return.
*/
scene_manager_set_scene_state(pokemon_fap->scene_manager, GenITradeScene, index);
scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneGenITrade, index);
scene_manager_next_scene(pokemon_fap->scene_manager, index);
}

bool gen_back_event_callback(void* context) {
furi_assert(context);
PokemonFap* pokemon_fap = context;

scene_manager_next_scene(pokemon_fap->scene_manager, ConfirmExitScene);
scene_manager_next_scene(pokemon_fap->scene_manager, PokemonSceneExitConfirm);
return true;
}

void gen_scene_on_enter(void* context) {
void pokemon_scene_gen_on_enter(void* context) {
char buf[32];
char name_buf[11]; // All name buffers are 11 bytes at most, including term
PokemonFap* pokemon_fap = (PokemonFap*)context;
Expand All @@ -71,12 +72,12 @@ void gen_scene_on_enter(void* context) {

// Set up trade party struct
if(!pokemon_fap->pdata) {
state = scene_manager_get_scene_state(pokemon_fap->scene_manager, GenITradeScene);
state = scene_manager_get_scene_state(pokemon_fap->scene_manager, PokemonSceneGenITrade);
switch(state) {
case GenITradeScene:
case PokemonSceneGenITrade:
state = GEN_I;
break;
case GenIITradeScene:
case PokemonSceneGenIITrade:
state = GEN_II;
break;
default:
Expand All @@ -88,7 +89,7 @@ void gen_scene_on_enter(void* context) {
/* Clear the scene state as this is the first entry in to this scene
* we definitely want to be completely reset.
*/
scene_manager_set_scene_state(pokemon_fap->scene_manager, GenITradeScene, 0);
scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneGenITrade, 0);

/* Allocate select and trade views */
/* Allocates its own view and adds it to the main view_dispatcher */
Expand All @@ -112,8 +113,8 @@ void gen_scene_on_enter(void* context) {
* which is fine but would just waste a few more bytes compared to us handling
* it here.
*/
scene_manager_set_scene_state(pokemon_fap->scene_manager, SelectMoveScene, 0);
scene_manager_set_scene_state(pokemon_fap->scene_manager, SelectItemSetScene, 0);
scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneMove, 0);
scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneItemSet, 0);

submenu_reset(pokemon_fap->submenu);

Expand All @@ -123,20 +124,20 @@ void gen_scene_on_enter(void* context) {
"Pokemon: %s",
table_stat_name_get(pokemon_fap->pdata->pokemon_table, pkmn_num));
submenu_add_item(
pokemon_fap->submenu, buf, SelectPokemonScene, scene_change_from_main_cb, pokemon_fap);
pokemon_fap->submenu, buf, PokemonSceneSelect, scene_change_from_main_cb, pokemon_fap);

pokemon_name_get(pokemon_fap->pdata, STAT_NICKNAME, name_buf, sizeof(name_buf));
snprintf(buf, sizeof(buf), "Nickname: %s", name_buf);
submenu_add_item(
pokemon_fap->submenu, buf, SelectNicknameScene, scene_change_from_main_cb, pokemon_fap);
pokemon_fap->submenu, buf, PokemonSceneNickname, scene_change_from_main_cb, pokemon_fap);

snprintf(
buf,
sizeof(buf),
"Level: %d",
pokemon_stat_get(pokemon_fap->pdata, STAT_LEVEL, NONE));
submenu_add_item(
pokemon_fap->submenu, buf, SelectLevelScene, scene_change_from_main_cb, pokemon_fap);
pokemon_fap->submenu, buf, PokemonSceneLevel, scene_change_from_main_cb, pokemon_fap);

if(pokemon_fap->pdata->gen == GEN_II) {
snprintf(
Expand All @@ -147,21 +148,21 @@ void gen_scene_on_enter(void* context) {
pokemon_fap->pdata->item_list,
pokemon_stat_get(pokemon_fap->pdata, STAT_HELD_ITEM, NONE)));
submenu_add_item(
pokemon_fap->submenu, buf, SelectItemScene, scene_change_from_main_cb, pokemon_fap);
pokemon_fap->submenu, buf, PokemonSceneItem, scene_change_from_main_cb, pokemon_fap);
}

submenu_add_item(
pokemon_fap->submenu,
"Select Moves",
SelectMoveScene,
PokemonSceneMove,
scene_change_from_main_cb,
pokemon_fap);

if(pokemon_fap->pdata->gen == GEN_I) {
submenu_add_item(
pokemon_fap->submenu,
"Select Types",
SelectTypeScene,
PokemonSceneType,
scene_change_from_main_cb,
pokemon_fap);
}
Expand All @@ -170,7 +171,7 @@ void gen_scene_on_enter(void* context) {
pokemon_fap->submenu,
namedlist_name_get_index(
pokemon_fap->pdata->stat_list, pokemon_stat_get(pokemon_fap->pdata, STAT_SEL, NONE)),
SelectStatsScene,
PokemonSceneStats,
scene_change_from_main_cb,
pokemon_fap);

Expand All @@ -181,22 +182,22 @@ void gen_scene_on_enter(void* context) {
"Shiny: %s",
select_shiny_is_shiny(pokemon_fap->pdata) ? "Yes" : "No");
submenu_add_item(
pokemon_fap->submenu, buf, SelectShinyScene, scene_change_from_main_cb, pokemon_fap);
pokemon_fap->submenu, buf, PokemonSceneShiny, scene_change_from_main_cb, pokemon_fap);

snprintf(buf, sizeof(buf), "Gender: %s", select_gender_get(pokemon_fap->pdata));
submenu_add_item(
pokemon_fap->submenu, buf, SelectGenderScene, scene_change_from_main_cb, pokemon_fap);
pokemon_fap->submenu, buf, PokemonSceneGender, scene_change_from_main_cb, pokemon_fap);

snprintf(buf, sizeof(buf), "Pokerus: %s", select_pokerus_status(pokemon_fap));
submenu_add_item(
pokemon_fap->submenu, buf, SelectPokerusScene, scene_change_from_main_cb, pokemon_fap);
pokemon_fap->submenu, buf, PokemonScenePokerus, scene_change_from_main_cb, pokemon_fap);

if(pokemon_stat_get(pokemon_fap->pdata, STAT_NUM, NONE) == 0xC8) { // Unown
snprintf(buf, sizeof(buf), "Unown Form: %c", unown_form_get(pokemon_fap->pdata));
submenu_add_item(
pokemon_fap->submenu,
buf,
SelectUnownFormScene,
PokemonSceneUnownForm,
scene_change_from_main_cb,
pokemon_fap);
}
Expand All @@ -208,25 +209,35 @@ void gen_scene_on_enter(void* context) {
"OT ID#: %05d",
pokemon_stat_get(pokemon_fap->pdata, STAT_OT_ID, NONE));
submenu_add_item(
pokemon_fap->submenu, buf, SelectOTIDScene, scene_change_from_main_cb, pokemon_fap);
pokemon_fap->submenu, buf, PokemonSceneOTID, scene_change_from_main_cb, pokemon_fap);

pokemon_name_get(pokemon_fap->pdata, STAT_OT_NAME, name_buf, sizeof(name_buf));
snprintf(buf, sizeof(buf), "OT Name: %s", name_buf);
submenu_add_item(
pokemon_fap->submenu, buf, SelectOTNameScene, scene_change_from_main_cb, pokemon_fap);
pokemon_fap->submenu, buf, PokemonSceneOTName, scene_change_from_main_cb, pokemon_fap);

submenu_add_item(
pokemon_fap->submenu, "Trade PKMN", TradeScene, scene_change_from_main_cb, pokemon_fap);
pokemon_fap->submenu, "Trade PKMN", PokemonSceneTrade, scene_change_from_main_cb, pokemon_fap);

/* TODO: Add Save pokemon option here */

/* HACK: No matter what gen were in, we just store the scene state in GenITradeScene */
/* HACK: No matter what gen were in, we just store the scene state in PokemonSceneGenITrade */
submenu_set_selected_item(
pokemon_fap->submenu,
scene_manager_get_scene_state(pokemon_fap->scene_manager, GenITradeScene));
scene_manager_get_scene_state(pokemon_fap->scene_manager, PokemonSceneGenITrade));

view_dispatcher_set_navigation_event_callback(
pokemon_fap->view_dispatcher, gen_back_event_callback);

view_dispatcher_switch_to_view(pokemon_fap->view_dispatcher, AppViewMainMenu);
}

bool pokemon_scene_gen_on_event(void* context, SceneManagerEvent event) {
UNUSED(context);
UNUSED(event);
return false;
}

void pokemon_scene_gen_on_exit(void* context) {
UNUSED(context);
}
8 changes: 0 additions & 8 deletions src/scenes/pokemon_gen.h

This file was deleted.

17 changes: 15 additions & 2 deletions src/scenes/pokemon_gender.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

#include <src/include/pokemon_app.h>
#include <src/include/pokemon_data.h>
#include <src/scenes/pokemon_menu.h>

#include <src/scenes/pokemon_scene.h>

static const char* gender_str[] = {
"Unknown",
Expand Down Expand Up @@ -91,7 +92,7 @@ static void select_gender_selected_callback(void* context, uint32_t index) {
scene_manager_previous_scene(pokemon_fap->scene_manager);
}

void select_gender_scene_on_enter(void* context) {
void pokemon_scene_select_gender_on_enter(void* context) {
PokemonFap* pokemon_fap = (PokemonFap*)context;

submenu_reset(pokemon_fap->submenu);
Expand All @@ -102,3 +103,15 @@ void select_gender_scene_on_enter(void* context) {
submenu_add_item(
pokemon_fap->submenu, "Male", 1, select_gender_selected_callback, pokemon_fap);
}

bool pokemon_scene_select_gender_on_event(void* context, SceneManagerEvent event)
{
UNUSED(event);
UNUSED(context);

return false;
}

void pokemon_scene_select_gender_on_exit(void* context) {
UNUSED(context);
}
2 changes: 0 additions & 2 deletions src/scenes/pokemon_gender.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,4 @@ const char* select_gender_is_static(PokemonData* pdata, uint8_t ratio);
/* This will return a pointer to a string of the pokemon's current gender */
char* select_gender_get(PokemonData* pdata);

void select_gender_scene_on_enter(void* context);

#endif // POKEMON_GENDER_H
Loading

0 comments on commit 8a0c348

Please sign in to comment.